1. 程式人生 > 其它 >2 第二章 Ansible Ad-Hoc介紹

2 第二章 Ansible Ad-Hoc介紹

2 第二章 Ansible Ad-Hoc介紹

2.1 Ad-Hoc使用場景

所謂Ad-Hoc, 簡而言之是 “臨時命令",英文中作為形容詞有 “特別的, 臨時的含義。Ad-Hoc只是官方對Ansible命令的一種稱謂, 大家按各自習慣稱呼即可。一般稱之為臨時操作 ” 或Ansible命令 。

從功能上講, Ad-Hoc是相對Ansible-playbook而言的, Ansible提供兩種完成任務方式:一 種是Ad-Hoc命令集, 即命令Ansible, 另外一 種就是Ansible-playbook了, 即命令 ansible­-playbook。前者更注重千解決一些簡單或者平時工作中臨時遇到的任務, 相當於Linux系統命令列下的Shell命令, 後者更適合千解決複雜或需固化下來的任務, 相當千Linux系統的Shell Scripts。通常,深入Ansible是從接觸Ansible-playbook開始的, 靈活運用Ansible-playbook才能更好地體會到Ansible的強大所在。

具體來講, 什麼樣的場景下需要用到Ad-Hoc, 什麼樣的情況下需要使用Ansible-playbook呢?

2.1.1 需要使用Ad-Hoc的場景

情景1:節假日將至, 我們需要關閉所有不必要的伺服器, 並對所有伺服器進行節前健康檢查。

情景2:臨時更新Apache &Nginx的配置檔案,且需同時將其分發至所有需更新該配置的Web伺服器。

2.1.2 需要使用Ansible-playbook的場景

情景1:新購置的伺服器安裝完系統後需做一系列固化的初始化工作,諸如:定製防火牆策略、新增NTP時間同步配置、新增EPEL源等。

情景2:業務側每週定期對生產環境釋出更新程式程式碼。

其實兩者之間關係用急行軍(Ad-Hoc)和遠征軍(Ansible-playbook)來形容可能更容易理解。急行軍需輕裝上陣,注重靈活機動;遠征軍需穩紮穩打,注重長遠規劃。正如我們上面所講,Ad-Hoc更注重千解決一些簡單或者平時工作中臨時遇到的任務,Ansible-playbook更適合於解決複雜的或需固化下來的任務。

2.2 Ad-Hoc命令集介紹

2.2.1 Ad-Hoc命令集用法簡介

Ad-Hoc命令集由/usr/bin/ansible實現,其命令用法如下:

ansible <host-pattern> [options]

可以用選項如下:
-v,--verbose:輸出更詳細的執行過程資訊,-vvv可得到執行過程所有資訊。
-i,PATH,--inventory(清單)=PATH:指定inventory(清單)資訊,預設/etc/ansible/hosts
-f NUM,--forks=NUM:併發執行緒數,預設5個執行緒。
--private-key=PRIVATE_KEY_FILE:指定金鑰檔案。
-m NMAE,--module-name=NAME:指定執行使用的模組。
-M DIRECTORY,--module-path=DIRECTORY:指定模組存放路徑,預設/usr/share/ansible,也可以通過ANSIBLE_LIBRARY設定預設路徑。
-a ‘ARGUMENTS’,--args=‘ARGUMENTS’:模組引數。
-k,--ask-pass SSH:認證密碼
-K,--ask-sudo-pass sudo:使用者的密碼(--sudo時使用)。
-o,--one-line:標準輸出至一行。
-s,--sudo:相當於Linux系統下的sudo命令。
-t DIRECTORY,--tree=DIRECTORY:輸出資訊至DIRECTORY目錄下,結果檔案以遠端主機命名。
-T SECONDS,--timeout=SECONDS:指定連線遠端主機的最大超時,單位是秒。
-B NUM,--background=NUM:後臺執行命令,超NUM秒後中止正在執行的任務。
-P NUM,--poll=NUM:定期返回後臺任務進度。
-u USERNAME,--user=USERNAME:指定遠端主機以USERNAME執行命令。
-U SUDO_USERNAME,--sudo-user=SUDO_USERNAME:使用sudo,相當於LInux下的sudo命令。
-c CONNECTION,--connection=CONNECTION:指定連線方式,可用選項paramiko(SSH)、ssh、local,local方式常用於crontab和kickstarts。
-l SUBSET,--limit=SUBSET:指定執行主機。
-l ~REGEX,--limit=~REGEX:指定執行主機(正則)。
--list-hosts:列出符合條件的主機列表,不執行任何命令。

情景 1: 檢查 proxy 組所有主機是否存活。

執行命令:

ansible proxy -f 5 -m ping

執行結果:

其中 192.168.37.159 是指命令執行的主機, Success 表示命令執行成功, ">> {} 表示詳細返回結果如下。 ”“changed": false" 表示沒有對主機做變更, ”“ping": "pong"" 表示執行了 ping 命令返回結果為 pong。

情景 2: 列出 Web 組所有主機列表。

執行命令:

ansible web --list

執行結果:

Ansible命令執行流程圖

2.2.2 通過Ad-Hoc檢視系統設定

通過 df、free 命令檢視系統設定,但是是通過 Ad-Hoc 實現的,如下演示。

情景 1: 批量檢視 apps 組所有主機的磁碟容量(使用 command 模組)。

執行命令:

ansible apps -a "df -lh"

返回結果如下:

情景 2: 批量檢視遠端主機記憶體使用情況 (shell 模組)。

執行命令:

ansible apps -m shell -a "free -m"

返回結果如下:

2.2.3 通過Ad-Hoc研究Ansible的併發特性

Ansible和Ansible-playbook 預設會 fork 5 個執行緒併發執行命令, 但在實際工作中, 如果主機數量眾多,Ansible 併發 5 個執行緒是遠不能滿足企業所需的, 所以本節介紹 Ansible 的併發特性。 通過如下測試來更深入地瞭解 Ansible 的併發工作模式。

執行命令:

ansible apps -m ping -f 3 

返回結果如下:

  1. 同樣的命令多次執行, 但每次的輸出結果都不一定一樣

  2. 輸出結果不是按照/etc/ansible/hosts 中 [apps] 定義的主機順序輸出。

  3. 結果輸出基本上遵循每次輸出 3條記錄(執行緒池始終保持 3個執行緒, 所以這裡如果每次輸出小於等於3都是正常的)。

通過上面的實驗可以對 Ansible 的併發性有了概念性的瞭解。 回到前面的問題,企業實際應用中, 如主機數量很多,我們需調大執行緒數, 該如何操作呢?這裡 Ansible 為我們提供了便捷的選項,-f 指定執行緒數, 如-f 1 表示併發啟動一個執行緒, -f 10 則表示同時啟動 10 個執行緒併發執行命令。其實檢視原始碼可知,Ansible 使用multiprocessing 管理多執行緒。

單臺主機的效能始終有限, 大家根據自己機器實際的硬體配置做調整, 建議併發數配置的 CPU 核數偶數倍就好。 如 4Cores 8GB 的伺服器, 建議最多併發 20 個執行緒。

2.2.4 通過Ad-Hoc研究Ansible的模組使用

Ansible 也提供了類似千 man 功能的 help 說明工具 ansible-doc, 直接按回車鍵或輸入-h顯示功能用法。

命令用法:

ansible -doc [options] [module... ]

可用選項如下:
--version: 顯示工具版本號。
-h, --help:顯示該 help 說明。
-M MODULE _pATH, --module-path=MODULE _pATH: 指定 Ansible模組的預設載入目錄。
-I, --list: 列出所有可用模組。
-s, --snippet: 只顯示 playbook 說明的程式碼段。
-v:等同於—version , 顯示工具版本號。

情景1:顯示所有可用模組。

執行命令:

ansible-do c -1

返回結果如下:

情景2:獲取yum 模組的HELP 說明。

執行命令:

ansible-doc yum

返回結果如下:

2.2.5 Ansible模組練習

情景1:安裝redhat-lsb 並檢視伺服器系統版本號。

1)安裝redhat-lsb。

ansible apps -m yum -a 'name=redhat-lsb state=present'

2)檢視系統版本號

ansible apps -m command -a'lsb_release -a'

情景2:為所有伺服器安裝ntp服務, 並設定為開機啟動。

1)安裝ntp服務。

ansible apps -s -m yum -a "name=ntp state=present"

2)啟動ntp服務, 並設定為開機啟動。

ansible apps -m service -a "name=ntpd state=Started enabled=yes"

2.3 Ad-Hoc組管理和特定主機變更

2.3.1 Ad-Hoc組定義

Ad-Hoc 的組功能定義在 Inventory 檔案中,預設路徑是 /etc/ansible/hosts, 書寫格式遵循 INI 風格,中括號中的字元為組名。可以將同一個主機同時歸併到多個不同的組中;

此外,若目標主機使用了非預設的 SSH 埠,還可以在主機名稱之後使用冒號加埠號來標明。下面通過實際案例來了解 Inventory 檔案的書寫規則。

如下為 Inventory 檔案示例,包括了組定義及冒號加埠號功能的使用。

ntp.magedu.com 

[webservers]
wwwl.magedu.com:2222
www2.magedu.com

[dbservers]
dbl.magedu.com
db2.magedu.com
db3.magedu.com

如果遠端主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機,如下案例為大家展示該寫法。

[webservers] 
www[01:50].magedu.com

[databases]
db-[a:f].magedu.com

2.3.2 Ad-Hoc配置管理:配置Proxy與Web Servers實踐

1) Nginx、PHP 安裝命令如下:

ansible app -m yum -a "name=nginx state=present" 

ansible app -m yum -a "name=php state=present"

2) Django 安裝命令如下:

安裝 MySQL-python 和 python-setuptools 依賴包

ansible app -m yum -a "name=MySQL-python state=present"

ansible app -m yum -a "name=python-setuptools state=present"

安裝 Django

ansible app -m pip -a "name=django state=present"

檢查 Django 安裝是否正常, 執行命令如下:

ansible app -m command -a "python -c 'import django; print django.get_version ()'" 

2.3.3 Ad-Hoc配置後端:配置NoSQL與Database Servers實踐

1)安裝MariaDB-server

ansibledb -m yum -a "name=MariaDB-server state=present"

2)安裝MariaDB-client

ansibledb -m yum -a "name=MariaDB-client state=present"

3)開啟防火牆 3306訪問許可權

ansible db -m command -a "iptables -A INPUT -s 192.168.37.0/24 -p tcp -rn tcp --dport 3306 -j ACCEPT"

2.3.4 Ad-Hoc特定主機變更

1) --limit :通過-limit 引數限定主機做變更。

情景:在App組中啟動 192.168.37.15 的 NTP 服務。

命令用法:

ansible app -m command -a "systemctl status ntpd" --limit ” 192.168.37.158"

2 ) 指定 IP: 通過指定具體 IP 限定主機做變更。

情景:啟動 192.168.37.158 的NTP 服務。

執行命令:

ansible 192.168.37.158 -m command -a "systemctl status ntpd"

3) 作分隔符, 指定多臺機器做變更。

情景:啟動 192.168.37.158和192.168.37.161的NTP 服務。

執行命令:

ansible "192.168.37.158:192.168.37.161" -m command -a "systemctl status ntpd"

2.4 Ad-Hoc使用者與組管理

使用者許可權管理是運維日常最重要的管理工作之一,如生產環境禁用開發和測試人員登入變更,但測試環境的使用者許可權仍需耗費精力維護,這項工作大公司也存在(將測試環境交給測試或開發管理並不是每個公司都能做到的,但未來是趨勢)。

所以掌握Ad-Hoc使用者與組管理很有用,如筆者現在的公司每次大版本更新後都會大量修改所有伺服器密碼。每次需要修改數十臺伺服器環境密碼,若手動單臺登入修改可是一項不小的工作, 並且手動方式難免會出錯誤。

Ansible系統使用者模組有如下兩個:

  • Linux系統使用者管理:user

  • Windows系統使用者管理:win_user

2.4.1 Linux使用者管理

User模組功能諸多,各功能作用幾乎完全覆蓋平時工作常規及非常規場景。模組所有屬性如表所示

情景1:新增使用者

需求描述: 新增使用者dba, 使用BASH Shell, 附加組為admins, dbagroup, 家目錄為/home/dba/

執行命令:

ansibledb -m user -a "name=dba shell=/bin/bash groups=admins,dbagroup append=yes home=/home/dba/ state=present"

情景2:修改使用者屬組

需求描述:修改DBA附件組為dbagroups (即刪除 admins 組許可權)

執行命令:

ansibledb -m user -a "name=dba groups=dbagroup append=no" 

情景3:修改使用者屬性

需求描述:設定 dba 使用者的過期時間為 2016/6/1 18:00:00 (UNIXTIME: 1464775200)。

執行命令:

ansibledb -m user -a "name=dba expires=1464775200" 

情景4:刪除使用者

需求描述:刪除使用者DBA, 並刪除其家目錄和郵件列表。

執行命令:

ansibledb -m user -a "name=dba state=absent remove=yes"

情景5:變更使用者密碼

需求描述:設定系統使用者 tom 的密碼為 redhat123。

執行命令:

ansibledb -m user -a "name=tom shell=/bin/bash password=redhat123 update password=always" 

2.4.2 Windows使用者管理

Ansible 同樣支援 Windows 系統。但考慮 Windows 不開源的特殊性及伺服器市場的佔有率,使得 Ansible 與 Windows 的結合使用時總是會出問題,但其實類似問題其他工具也同樣存在,這是 Windows 特性使然。

情景:新增使用者 stanley, 密碼為 magedu@l 23, 屬組為 Administrators。

ansible wind ows -m win_user -a "name=stanley passwd=magedu@l23 group=Administrators" 

2.4.3 應用層使用者管理

Ansible 支援商業系統或產品類應用, 系統如 AWS 的 1AM, MAC 的 osx; 軟體如 Apache CloudStack、Jabberd、 Open Stack、MongoDB、MySQL、PostgreSQL、RabbitMQ、Vertica等

情景:新增 MySQL 使用者 stanley, 設定登入密碼為 magedu@bj, 對zabbix* 表有ALL 許可權。

ansible db -m mysql_user -a'login_host=localhost login_password=magedu login_ user=root name=stanley password=magedu@bj priv=zabbix.*:ALL state=present'
本文摘抄或總結其他筆記,筆記不涉及任何商業用途,如果侵權請及時聯絡處理