本節書摘來自華章出版社《ansible權威指南》一書中的第2章,第2.3節,作者 李松濤 魏 巍 甘 捷 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
2.3 ansible指令用法詳解
ansible指令行執行方式有ad-hoc、ansible-playbook兩種方式,web化執行方式其官方提供了付費産品tower(10台以内免費),個人的話可以基于其提供的api開發類似的web化産品。關于指令行執行的兩種方式ad-hoc和ansible-playbooks、什麼是ad-hoc及ad-hoc與ansible-playbook的差別我們在第3章有詳細介紹,這裡不再贅述。需簡要說明的是兩者沒有本質上的差別,ad-hoc主要用于臨時指令的執行,ansibel-playbook可以了解為ad-hoc的集合,通過一定的規則編排在一起。兩者的操作也極其簡便,且提供了如with_items、failed_when、changed_when、until、ignore_errors等豐富的邏輯條件和dry-run的check mode。但在chceck mode下并不真正執行指令,即将執行的操作不會對端伺服器産生任何影響,隻模拟指令的執行過程是否能正常執行。
通過第1章的學習我們知道,ansible的通信預設基于ssh,是以我們需要對主機先進行認證。ansible認證方式有密碼認證和公私鑰認證兩種方式,其實完全等同于ssh的認證,是以這裡關于這兩種認證方式不做過多介紹。ansible預設使用(筆者也建議各位使用)公私鑰認證方式,究其原因無非是出于安全的考慮,密碼不用明文存放。以本機為例,執行如下指令即可添加本機認證資訊。
随機生成公私鑰對,ssh-keygen是linux下認證密鑰生成、管理和轉換工具,詳細用法可參考其man文檔
ssh-keygen -n -b
4096 -t rsa -c [email protected] -f root.sshstanley.rsa
為本機添加密鑰認證
ssh-copy-id –i
root.sshstanley.rsa root@localhost
輸入的時候會有如下提示:
are you sure you
want to continue connecting (yesno)
輸入全小寫的英文字母yes即可。
而後會有類似如下提示輸入對應root使用者的密碼資訊:
root@localhost's
password
輸入正确的密碼資訊後結果認證,随後在目前指令行輸入如下指令嘗試免密碼登入:
ssh -i
如不提示輸入密碼即可直接登入則表示密鑰驗證成功。當然,這裡隻是為大家簡要示範密鑰認證的過程,實際應用中為友善起見,一般會使用非root使用者生成預設檔案名為id_rsa、id_rsa.pub的密鑰對,在使用時通過sudo的方式擷取權限。
ansible的指令使用格式如下:
ansible
host-pattern [options]
host-pattern是inventory中定義的主機或主機組,可以為ip、hostname、inventory中的group組名、具有“.”或“”或“:”等特殊字元的比對型字元串,表示該選項是必須項,不可忽略。
[options]是ansible的參數選項,[]表示該選項中的參數任選其一。
ansible指令可用選項非常多,這裡列舉如下會用到的選項,詳細選項可參考man或第3章。
-m name,
--module-name=name:指定執行使用的子產品。
-u username,
--user=username:指定遠端主機以username運作指令。
-s, --sudo:相當于linux系統下的sudo指令。
-u
sudo_username, --sudo-user=sudo_username:使用sudo,相當于linux下的sudo指令。
具體示例如下:
以bruce使用者執行ping存活檢測
ansible all -m
ping -u bruce
以bruce sudo至root執行ping存活檢測
ping -u bruce --sudo
以bruce sudo至batman使用者執行ping存活檢測
ping -u bruce --sudo --sudo-user batman
但在新版本中ansible的sudo指令廢棄,改為--become或-b,如上指令需改為如下:
ping -u bruce -b
ping -u bruce -b --become-user batman
ansible-playbook的指令用法和ansible略有不同,雖然參數選項與ansible有很多相同的地方,但也新增了針對ansible-playbook特有的參數。
ansible-playbook的指令使用格式如下:
ansible-playbook
playbook.yml
ansible-playbook指令後跟事先編輯好的playbook.yml檔案即可。本節隻簡單介紹其用法,在第4、5、6章有大量内容介紹其寫法、進階用法及優化方向。ansible-playbook新增的功能參數如下:
--ask-vault-pass:加密playbook檔案時提示輸入密碼。
-d, --diff:當更新的檔案數及内容較少時,該選項可顯示這些檔案不同的地方,該選項結合-c用會有較好的效果。
-e extra_vars,
--extra-vars=extra_vars:在playbook中引入外部變量。
--flush-cache:将fact清除到的遠端主機緩存。
--force-handlers:強制運作handlers的任務,即使在任務失敗的情況下。
-i inventory:指定要讀取的inventory檔案。
--list-tags:列出所有可用的tags。
--list-tasks:列出所有即将被執行的任務。
--skip-tags=skip_tags:跳過指定的tags任務。
--start-at-task=start_at_task:從第幾條任務開始執行。
--step:逐漸執行playbook定義的任務,并經人工确認後繼續執行下一步任務。
--syntax-check:檢查playbook中的文法書寫。
-t tags,
--tags=tags:指定執行該tags的任務。
在日常工作中,大家經常會遇到批量添加認證的問題,而逐條添加認證方式,如機械地對每台主機都一條條添加認證,那是一件非常麻煩的事,也違反了我們期望的自動化方式。具體的批量添加認證方式請參考第9章。如前面所介紹,ansible不僅有ansible、ansible-playbook指令,還有ansible-galaxy、ansible-pull、ansible-doc、ansible-vault、ansible-console(2.0版本新增)指令,掌握ansible的基礎用法後,我們将更深一步學習ansible系列指令。