- Ansible權威指南
- 李松濤 魏巍 甘捷
- 110字
- 2019-01-04 06:58:43
第2章
Ansible基礎元素介紹
第1章介紹了Ansible的功能作用、通信發展史、基礎的安裝部署及處理Ansible安裝問題所需的Python多環境管理工具Pyenv和Virutalenv。在前期基本工作準備妥當的基礎上,本章進一步深入學習Ansible的基礎元素,會相繼接觸Ansible目錄結構簡介、Ansible系列命令、Ansible Inventory配置規范、Ansible模式匹配規則等,其中部分內容,諸如Inventory、Ansible-playbook等在后續涉及章節會更深入介紹。本章主要是為大家呈現Ansible及系列命令的基礎入門介紹,所介紹的內容相互之間沒有緊密關系,可選擇性地閱讀感興趣章節。
2.1 Ansible目錄結構介紹
Ansible是開源工具,整個開發過程或二次開發均遵循GPL協議,所以所有源碼均可見。作為一款日常工作所需的核心軟件,我們有必要知道其目錄分布及各目錄功能。通過如下命令我們可以獲取Ansible所有文件存放目錄:
# rpm -ql ansible
該命令輸出內容較多,大致分為如下幾類:
?配置文件目錄/etc/ansible/
?執行文件目錄/usr/bin/
?Lib庫依賴目錄/usr/lib/pythonX.X/site-packages/ansible/
?Help文檔目錄/usr/share/doc/ansible-X.X.X/
?Man文檔目錄/usr/share/man/man1/
整體的目錄概要可參考如圖2-1所示的Ansible目錄樹結構。

圖2-1 Ansible目錄樹結構
其中,如下目錄運維常要配置,需熟練掌握。
1)配置文件目錄/etc/ansible/,主要功能為:Inventory主機信息配置、Ansible工具功能配置等。所有Ansible的配置均存放在該目錄下,運維日常的所有配置類操作也均基于此目錄進行。
2)執行文件目錄/usr/bin/,主要功能為:Ansible系列命令默認存放目錄。Ansible所有的可執行文件均存放在該目錄下。
在/usr/lib/pythonXXX/site-packages/下,該目錄是系統當前默認的Python路徑,因為Ansible是基于Python編寫的,所以Ansible的所有lib庫文件和模塊文件也均存放于該目錄下。希望了解Ansible源碼的話可至該目錄下查看其工作原理,當然也可至GitHub 上下載歷史或最新Ansible
版本。
2.2 Ansible配置文件解析
Inventory用于定義Ansible的主機列表配置,Ansible的自身配置文件只有一個,即ansible.cfg, Ansible安裝好后它默認存放于/etc/ansible/目錄下。ansible.cfg配置文件可以存在于多個地方,Ansible讀取配置文件的順序依次是當前命令執行目錄→用戶家目錄下的.ansible.cfg→/etc/ansible.cfg,先找到哪個就使用哪個的配置。其ansible.cfg配置的所有內容均可在命令行通過參數的形式傳遞或定義在Playbooks中。
配置文件ansible.cfg約有350行語句,大多數為注釋行默認配置項。該文件遵循INI格式,分為如下幾類配置。
(1)[defaults]
該類配置下定義常規的連接類配置,如inventory、library、remote_tmp、local_tmp、forks、poll_interval、sudo_user、ask_sudo_pass、ask_pass、transport、remote_port等。
[defaults] # inventory = /etc/ansible/hosts # 定義Inventory # library = /usr/share/my_modules/ # 自定義lib庫存放目錄 # remote_tmp = $HOME/.ansible/tmp # 臨時文件遠程主機存放目錄 # local_tmp = $HOME/.ansible/tmp # 臨時文件本地存放目錄 # forks = 5 # 默認開啟的并發數 # poll_interval = 15 # 默認輪詢時間間隔 # sudo_user = root # 默認sudo用戶 # ask_sudo_pass = True # 是否需要sudo密碼 # ask_pass = True # 是否需要密碼 # roles_path = /etc/ansible/roles # 默認下載的Roles存放的目錄 # host_key_checking = False # 首次連接是否需要檢查key認證,建議設為False # timeout = 10 # 默認超時時間 # timeout = 10 # 如沒有指定用戶,默認使用的遠程連接用戶 # log_path = /var/log/ansible.log # 執行日志存放目錄 # module_name = command # 默認執行的模塊 # action_plugins = /usr/share/ansible/plugins/action # action插件的存放目錄 # callback_plugins = /usr/share/ansible/plugins/callback # callback插件的存放目錄 # connection_plugins = /usr/share/ansible/plugins/connection # connection插件的 # 存放目錄 # lookup_plugins = /usr/share/ansible/plugins/lookup # lookup插件的存放目錄 # vars_plugins = /usr/share/ansible/plugins/vars # vars插件的存放目錄 # filter_plugins = /usr/share/ansible/plugins/filter # filter插件的存放目錄 # test_plugins = /usr/share/ansible/plugins/test # test插件的存放目錄 # strategy_plugins = /usr/share/ansible/plugins/strategy# strategy插件的存放目錄 # fact_caching = memory # getfact緩存的主機信息存放方式 # retry_files_enabled = False # retry_files_save_path = ~/.ansible-retry # 錯誤重啟文件存放目錄 …
上述是日常可能用到的配置,這些多數保持默認即可。
(2)[privilege_escalation]
出于安全角度考慮,部分公司不希望直接以root的高級管理員權限直接部署應用,往往會開放普通用戶權限并給予sudo的權限,該部分配置主要針對sudo用戶提權的配置。
[privilege_escalation] # become=True # 是否sudo # become_method=sudo # sudo方式 # become_user=root # sudo后變為root用戶 # become_ask_pass=False # sudo后是否驗證密碼
(3)[paramiko_connection]
定義paramiko_connection配置,該部分功能不常用,了解即可。
[paramiko_connection] # 該配置不常用到 # record_host_keys=False # 不記錄新主機的key以提升效率 # pty=False # 禁用sudo功能
(4)[ssh_connection]
Ansible默認使用SSH協議連接對端主機,該部署是主要是SSH連接的一些配置,但配置項較少,多數默認即可。
[ssh_connection] # pipelining = False # 管道加速功能,需配合requiretty使用方可生效
(5)[accelerate]
Ansible連接加速相關配置。因為有部分使用者不滿意Ansible的執行速度,所以Ansible在連接和執行速度方面也在不斷地進行優化,該配置項在提升Ansibile連接速度時會涉及,多數保持默認即可。
[accelerate] # accelerate_port = 5099 # 加速連接端口 # accelerate_timeout = 30 # 命令執行超時時間,單位秒 # accelerate_connect_timeout = 5.0 # 連接超時時間,單位秒 # accelerate_daemon_timeout = 30 # 上一個活動連接的時間,單位分鐘 # accelerate_multi_key = yes
(6)[selinux]
關于selinux的相關配置幾乎不會涉及,保持默認配置即可。
[selinux] # libvirt_lxc_noseclabel = yes # libvirt_lxc_noseclabel = yes
(7)[colors]
Ansible對于輸出結果的顏色也進行了詳盡的定義且可配置,該選項對日常功能應用影響不大,幾乎不用修改,保持默認即可。
[colors] # highlight = white # verbose = blue # warn = bright purple # error = red # debug = dark gray # deprecate = purple # skip = cyan # unreachable = red # ok = green # changed = yellow # diff_add = green # diff_remove = red # diff_lines = cyan
上面盡可能全地介紹了運維工作中可能需要修改的配置選項,除了在關閉首次連接提示(host_key_checking = False)或提速調整([accelerate]區域塊配置調整)時可能會稍做調整,其中絕大多數選項默認即可,Ansible安裝好后無需任何改動即可使用。
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 "stanley@magedu.com" -f/root/.ssh/stanley.rsa // 為本機添加密鑰認證 ssh-copy-id -i /root/.ssh/stanley.rsa root@localhost
輸入的時候會有如下提示:
Are you sure you want to continue connecting (yes/no)?
輸入全小寫的英文字母yes即可。
而后會有類似如下提示輸入對應root用戶的密碼信息:
root@localhost's password:
輸入正確的密碼信息后結果認證,隨后在當前命令行輸入如下命令嘗試免密碼登錄:
ssh -i /root/.ssh/stanley.rsa root@localhost
如不提示輸入密碼即可直接登錄則表示密鑰驗證成功。當然,這里只是為大家簡要演示密鑰認證的過程,實際應用中為方便起見,一般會使用非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存活檢測 ansible all -m ping -u bruce --sudo //以bruce sudo至batman用戶執行ping存活檢測 ansible all -m ping -u bruce --sudo --sudo-user batman
但在新版本中Ansible的sudo命令廢棄,改為--become或-b,如上命令需改為如下:
//以bruce sudo至root執行ping存活檢測 ansible all -m ping -u bruce -b //以bruce sudo至batman用戶執行ping存活檢測 ansible all -m 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系列命令。
2.4 Ansible系列命令用法詳解與使用場景介紹
如何獲取Ansible的系列命令呢?在終端鍵入ansible后連續按兩次Tab鍵,會補全所有以ansible字母開頭的命令,這些命令均是Ansible系列命令。本節我們來逐一介紹Ansible的系列命令使用。
?ansible
?ansible-galaxy
?ansible-pull
?ansible-doc
?ansible-playbook
?ansible-vault
?ansible-console
2.4.1 ansible
命令ansible是日常工作中使用率非常高的命令之一,man中是如此定義其功能的:run a command somewhere else,可見其靈活性。ansible命令主要在如下場景使用:
?非固化需求
?臨時一次性操作
?二次開發接口調用
那么什么是非固化需求和臨時一次性操作呢?簡單來講,比如工作中我臨時想查看web1服務器組是否存活,或我想臨時復制本地的/etc/fstab到web服務器組的/tmp目錄下做測試,類如這些沒有規律的、臨時需要做的任務,我們稱之為非固化需求、臨時一次性操作。具體的命令使用如下:
// 檢查服務器存活 ansible web1 -m ping // 復制本地文件到遠程 ansible web1 -m copy -a "src=/etc/fstab dest=/tmp/fstab owner=root group=root mode=644 backup=yes"
Ansible的返回結果都非常友好,一般會用3種顏色來表示執行結果:紅色、綠色、橘黃色。其中紅色表示執行過程有異常,一般會中止剩余所有的任務,如圖2-2所示的Ansible執行結果錯誤的結果返回;綠色和橘黃色表示執行過程沒有異常,所有任務均正常執行,但橘黃色表示命令執行結束后目標有狀態的變化。如圖2-3所示,Ansible執行結果正確的結果返回中的圓圈1為橘黃色顯示;而綠色表示命令執行結束后目標沒有狀態變化,如圖2-3中的圓圈2顯示。

圖2-2 Ansible執行結果錯誤的結果返回

圖2-3 Ansible執行結果正確的結果返回
不僅ansible命令的執行結果如此設置,Ansible系列命令均如此設置,所以判斷Ansible系列命令的執行結果是否正常是一件非常容易的事情,只要看顏色即可。
2.4.2 ansible-galaxy
這里的galaxy和三星手機沒有任何關系。ansible-galaxy的功能可以簡單地理解為GitHub或PIP的功能,通過ansible-galaxy命令,我們可以根據下載量和關注量等信息,查找和安裝優秀的Roles。Roles是Ansible非常重要的一項功能,關于Roles的詳細功能會在第6章介紹。在ansible-galaxy上,我們可以上傳和下載Roles,這里也是優秀Roles的聚集地,下載地址為https://galaxy.ansible.com。
ansible-galaxy命令使用格式如下:
ansible-galaxy [init|info|install|list|remove] [--help] [options] ...
ansible-galaxy命令分三大部分:
(1)[init|info|install|list|remove]
init:初始化本地的Roles配置,以備上傳Roles至galaxy。
?info:列表指定Role的詳細信息。
?install:下載并安裝galaxy指定的Roles到本地。
?list:列出本地已下載的Roles。
?remove:刪除本地已下載的Roles。
Ansible 2.0版本中,針對ansible-galaxy增加了login、import、delete、setup等功能,但這些功能需基于login在galaxy認證成功后方可執行,主要為了方便對galaxy上已有的Roles的配置工作。
(2)help用法顯示[--help]
針對第一部分的init、info等功能,其后跟--help可單獨顯示該項用法。例如:
ansible-galaxy init --help
執行后會返回ansible-galaxy init選項的用法說明。
Usage: ansible-galaxy init [options] role_name Options: -f, --force Force overwriting an existing role -h, --help show this help message and exit -c, --ignore-certs Ignore SSL certificate validation errors. -p INIT_PATH, --init-path=INIT_PATH The path in which the skeleton role will be created. The default is the current working directory. --offline Don't query the galaxy API when creating roles -s API_SERVER, --server=API_SERVER The API server destination -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging) --version show program's version number and exit
其他選項與help用法一樣。
(3)參數項[options]
該部分結合第一部分的參數完成ansible-galaxy完整的功能用法,如:
ansible-galaxy init [options] role_name即ansible-galaxy init后跟[-f|-h|-c|-p|--off line|-s SERVER|-v|--version]參數,后跟role-name成為一條完整的命令。
具體可參考如下:
// 下載用戶hectcastro的Nginx這個Role到本地并忽略錯誤(默認存放在/etc/ansible/roles/) ansible-galaxy --ignore-errors install azavea.git
因為ansible-galaxy是對https://galaxy.ansible.com網站的上傳、下載、配置類工作,如有類似如下報錯,請確保該網站可正常訪問。
the API server (galaxy.ansible.com) is not responding, please try again later.
2.4.3 ansible-pull
該指令的使用涉及Ansible的另一種工作模式:pull模式(Ansible默認使用push模式)。這和通常使用的push模式工作機理剛好相反,其適用于以下場景:①你有數量巨大的機器需要配置,即使使用高并發線程依舊要花費很多時間;②你要在剛啟動的、沒有網絡連接的主機上運行Anisble。
ansible-pull命令使用格式如下:
ansible-pull [options] [playbook.yml]
通過ansible-pull結合Git和crontab一并實現,其原理如下:通過crontab定期拉取指定的Git版本到本地,并以指定模式自動運行預先制訂好的指令。
具體示例參考如下:
*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts -U git:// git.kingifa.com/king-gw-ansiblepull >> /var/log/ ansible-pull.log 2>&1
ansible-pull通常在配置大批量機器的場景下會使用,靈活性稍有欠缺,但效率幾乎可以無限提升,對運維人員的技術水平和前瞻性規劃有較高要求。
2.4.4 ansible-doc
ansible-doc是Ansible模塊文檔說明,針對每個模塊都有詳細的用法說明及應用案例介紹,功能和Linux系統man命令類似。該命令使用方式如下:
ansible-doc [options] [module...]
ansible-doc命令后跟[options]參數或[模塊名],顯示模塊用法說明,具體示例如下:
// 列出支持的模塊 ansible-doc -l // 模塊功能說明 ansible-doc ping
2.4.5 ansible-playbook
ansible-playbook是日常應用中使用頻率最高的命令,其工作機制是:通過讀取預先編寫好的playbook文件實現批量管理。要實現的功能與命令ansible一樣,可以理解為按一定條件組成的ansible任務集。
ansible-playbook命令后跟YML格式的playbook文件,執行事先編排好的任務集,命令使用方式如下:
ansible-playbook playbook.yml
具體示例如下:
// 執行gw.yml這個playbook中定義的所有任務集 ansible-playbook gw.yml
Playbook具有編寫簡單、可定制性高、靈活方便,以及可固化日常所有操作的特點,運維人員應熟練掌握。
2.4.6 ansible-vault
ansible-vault主要用于配置文件加密,如編寫的Playbook配置文件中包含敏感信息,不希望其他人隨意查看,ansible-vault可加密/解密這個配置文件,具體使用方式如下:
Usage: ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file_name
具體示例如下。
設定如下密碼,加密a.yml文件。
ansible-vault encrypt a.yml
會有以下輸入加密密碼提示:
Vault password: Confirm Vault password: Encryption successful
這時,再打開a.yml文件后會發現該文件亂碼,只有通過如下命令解密后方可正常查看。
ansible-vault decrypt a.yml
輸入預設的密碼后方可解密。
Vault password: Decryption successful
此時a.yml文件可正常查看。
到此,我們對Ansible的用法及系列命令已經有了概念性的了解和掌握,接下來我們進一步了解Ansible Inventory文件的配置管理。
2.4.7 ansible-console
ansible-console是Ansible為用戶提供的一款交互式工具,用戶可以在ansible-console虛擬出來的終端上像Shell一樣使用Ansible內置的各種命令,這為習慣于使用Shell交互方式的用戶提供了良好的使用體驗。ansible-console主要是針對1.X版本中ansible-shell工具而研發的,目前官網還沒有對ansible-console進行詳細的用法說明,最新版本的Ansible軟件包也沒有對應的man文檔說明。經筆者實測,ansible-console命令的使用格式如下。
在終端鍵入ansible-console命令后,會進入如圖2-4所示的類似Shell一樣的交互式終端環境。

圖2-4 ansible-console命令用法1
圖2-4中的“root@all (4)[f:5]$”是提示符,該提示符表示“當前的使用用戶@當前所在的Inventory中定義的組,默認是all分組(Inventory中all組所有主機的數量)[forks:線程數]$”。
使用cd命令可切換至指定Hosts或分組,同時提示符的相應信息也會隨之變動,如圖2-5所示。

圖2-5 ansible-console命令用法2
如圖2-5中的Ansible-console命令用法2所示,cd至webs分組后,原來的root@all (4) [f:5]$也相應地變更為root@webs (3)[f:5],表示當前分組為webs分組,該分組所擁有的主機總數為3臺。執行forks 2后,提示符再次變更為root@webs (3)[f:2]$,表示設置并發的線程數為2。
所有的操作與Shell類似,而且支持Tab鍵補全,如啟動httpd服務時,鍵入service后連續按兩次Tab鍵后會自動補全剩余的命令選項。ansible-console命令用法3如圖2-6所示。

圖2-6 ansible-console命令用法3
如需啟動httpd服務,使用命令service name=httpd state=started,命令用法與Ad-Hoc一致,只是格式上的使用習慣不同而已。如想獲取service模塊更詳細的用法,輸入help service命令即可。ansible-console命令用法4如圖2-7所示。

圖2-7 ansible-console命令用法4
使用完畢如希望退出,按快捷鍵Ctrl+D或Ctrl+C即可退出當前的虛擬終端。
ansible-console命令在實際工作中用于Ad-Hoc和Ansible-playbooks之間的場景,常用于集中一批臨時操作或命令,使用Ad-Hoc要鍵入很多次但整體操作的復雜度又不至于使用Playbooks時,這時ansible-console是最佳選擇。
2.5 Ansible Inventory配置及詳解
Inventory是Ansible管理主機信息的配置文件,相當于系統HOSTS文件的功能,默認存放在/etc/ansible/hosts。為方便批量管理主機,便捷使用其中的主機分組,Ansible通過Inventory來定義其主機和組,在使用時通過-i或--inventory-file指定讀取,與Ansible命令結合使用時組合如下:
ansible -i /etc/ansible/hosts webs -m ping
如果只有一個Inventory時可不用指定路徑,默認讀取/etc/ansible/hosts。Inventory可以同時存在多個,而且支持動態生成,如AWS EC2、Cobbler等均支持,本節我們來學習Inventory的使用規則。
2.5.1 定義主機和組
Inventory配置文件遵循INI文件風格,中括號中的字符為組名。其支持將同一個主機同時歸并到多個不同的組中,分組的功能為IT人員維護主機列表提供了非常大的便利。此外,若目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明,以行為單位分隔配置,詳細信息可參考以下代碼中的注釋。
#“# ”開頭的行表示該行為注釋行,即當時行的配置不生效 # Inventory可以直接為IP地址 192.168.37.149 # Inventory同樣支持Hostname的方式,后跟冒號加數字表示端口號,默認22號端口 ntp.magedu.com:2222 nfs.magedu.com # 中括號內的內容表示一個分組的開始,緊隨其后的主機均屬于該組成員,空行后的主機亦屬于該組,即 web2.magedu.com這臺主機也屬于[websevers]組 [websevers] web1.magedu.com web[10:20].magedu.com # [10:20]表示10~20之間的所有數字(包括10和20),即表示web10. magedu.com、web11.magedu.com……web20.magedu.com的所有主機 web2.magedu.com[dbservers] db-a.magedu.com db-[b:f].magedu.com # [b:f]表示b到f之間的所有數字(包括b和f),即表示db-b.magedu. com、db-e.magedu.com……db-f.magedu.com的所有主機
2.5.2 定義主機變量
在日常工作中,通常會遇到非標準化的需求配置,如考慮到安全性問題,業務人員通常將企業內部的Web服務80端口修改為其他端口號,而該功能可以直接通過修改Inventory配置來實現,在定義主機時為其添加主機變量,以便在Playbook中使用針對某一主機的個性化要求。
[webservers] web1.magedu.com http_port=808 maxRequestsPerChild=801 # 自定義http_port的端口號為 808,配置maxRequestsPerChild為801
Ansible其實支持多種方式修改或自定義變量,Inventory是其中的一種修改方式,在第6章中我們會詳細介紹。不管哪種修改方式,大家一定要有自己的修改規范,以便于區別管理已有配置。
2.5.3 定義組變量
Ansible支持定義組變量,主要針對大量機器的變量定義需求,賦予指定組內所有主機在Playbook中可用的變量,等同于逐一給該組下的所有主機賦予同一變量。定義組變量的參考案例如下:
[groupservers] web1.magedu.com web2.magedu.com [groupservers:vars] ntp_server=ntp.magedu.com # 定義groupservers組中所有主機ntp_server值為ntp.magedu. com nfs_server=nfs.magedu.com # 定義groupservers組中所有主機nfs_server值為nfs.magedu. com
2.5.4 定義組嵌套及組變量
Inventory中,組還可以包含其他的組(嵌套),并且也可以向組中的主機指定變量。不過,這些變量只能在Ansible-playbook中使用,而Ansible不支持。組與組之間可以相互調用,并且可以向組中的主機指定變量。
參考示例如下:
[apache] httpd1.magedu.com httpd2.magedu.com [nginx] ngx1.magedu.com ngx2.magedu.com [webservers:children] apache nginx [webservers:vars] ntp_server=ntp.magedu.com
Ansible以簡單為其核心理念,上述實現在業務日常使用中并不常見,大家了解其用法即可。
2.5.5 多重變量定義
變量除了可以在Inventory中一并定義,也可以獨立于Inventory文件之外單獨存儲到YAML格式的配置文件中,這些文件通常以.yml、.yaml、.json為后綴或者無后綴。變量通常從如下4個位置檢索:
?Inventory配置文件(默認/etc/ansible/hosts)
?Playbook中vars定義的區域
?Roles中vars目錄下的文件
?Roles同級目錄group_vars和hosts_vars目錄下的文件
假如foosball主機同屬于raleigh和webservers組,那么其變量在如下文件中設置均有效:
/etc/ansible/group_vars/raleigh # can optionally end in '.yml', '.yaml', or '.json' /etc/ansible/group_vars/webservers /etc/ansible/host_vars/foosball
對于變量的讀取,Ansible遵循如上優先級順序,因此大家設置變量時盡量沿用同一種方式,以方便維護人員管理。
2.5.6 其他Inventory參數列表
除了支持如上的功能外,Ansible基于SSH連接Inventory中指定的遠程主機時,還內置了很多其他參數,用于指定其交互方式,如下列舉了部分重要參數:
ansible_ssh_host:指定連接主機ansible_ssh_port,指定SSH連接端口,默認22 ansible_ssh_user:指定SSH連接用戶ansible_ssh_pass,指定SSH連接密碼ansible_sudo_ pass:指定SSH連接時sudo密碼 ansible_ssh_private_key_file:指定特有私鑰文件 …
其他內置參數還有數十個,這些參數均可以直接寫在命令行或Playbook文件中,以覆蓋配置文件中的定義。更多參數請參考官網。
2.6 Ansible與正則
正則表達式(Patterns)是各類高級語言的必定支持的方法之一,Ansible也不例外。其Patterns功能等同于正則表達式,語法使用也和正則類同,這大大便利了運維的使用。其對于Ansible的靈活性有著極大貢獻,該功能同樣支持Ansible-playbook。其用法也非常簡單。
ansible <pattern_goes_here> -m <module_name> -a <arguments>
該功能主要針對Inventory的主機列表使用,我們通過一些案例可以更好地了解其功能及用法。在如下示例中主要針對webservers進行正則匹配:
// 重啟webservers組所有主機的httpd服務 ansible webservers -m service -a "name=httpd state=restarted"
(1)All(全量)匹配
匹配所有主機,all或*號功能相同。如檢測所有主機存活情況。
// all和*功能相同,但*號需引起來 ansible all -m ping ansible "*" -m ping
檢查192.168.1.0/24網段所有主機存活狀況。
ansible 192.168.1.* -m ping
(2)邏輯或(or)匹配
如我們希望同時對多臺主機或多個組同時執行,相互之間用“:”(冒號)分隔即可。
web1:web2
使用方式如下:
ansible "web1:web2" -m ping
(3)邏輯非(! )匹配
邏輯非用感嘆號(! )表示,主要針對多重條件的匹配規則,使用方式如下:
// 所有在webservers組但不在phoenix組的主機 webservers:! phoenix
(4)邏輯與(&)匹配
和邏輯非一樣,邏輯與也主要針對多重條件的匹配規則,只是邏輯上的判斷不同。邏輯與使用&表示,請看如下示例:
// webservers組和staging組中同時存在的主機 webservers:&staging
(5)多條件組合
Ansible同樣支持多條件的復雜組合,該情況企業應用不多,這里做簡單舉例說明。
//webservers和dbservers兩個組中的所有主機在staging組中存在且在 phoenix組中不存在的主機 webservers:dbservers:&staging:! phoenix
(6)模糊匹配
*通配符在Ansible表示0個或多個任意字符,主要應用于一些模糊規則匹配,在平時的使用中應用頻率非常高,請參考如下示例:
// 所有以.magedu.com結尾的主機均符合 *.magedu.com // one開頭.com結尾的所有主機和dbservers組中的所有主機 one*.com:dbservers
(7)域切割
Ansible底層基于Python,因此也支持域切割。Python字符串域切割的示例如下:
str = '12345678' print str[0:1]
通過[0:1]即可獲取數值1。該功能在Ansible中也支持,以如下Inventory內容為例:
[webservers] cobweb webbing weber
通過截取數組下標可以獲得對應變量值。
webservers[0] # == cobweb webservers[-1] # == weber webservers[0:1] # == webservers[0], webservers[1] # == cobweb, webbing webservers[1:] # == webbing, weber
(8)正則匹配
Ansible同樣完整支持正則匹配功能,“~”開始表示正則匹配。
~(web|db).*\.example\.com
檢測beta.example.com、web.example.com、green.example.com、beta.example.org、web. example.org、green.example.org的存活,使用如下匹配模式:
ansible "~(beta|web|green)\.example\.(com|org)" -m ping
檢測Inventory中所有以192.168開頭的服務器存活信息:
ansible ~192\.168\.[0-9]\{\2}.[0-9]\{2, } -m ping
關于Ansible的正則功能到此結束,相信大家在瀏覽的過程中對其靈活程度也會有所感觸,在對Ansible的實際應用過程中也會不斷地加深對其理解。
2.7 本章小結
本章著重為大家介紹了Ansible目錄結構功能及Ansible命令使用方式。在對Ansible的使用有概念性的了解后,又介紹Ansible系列命令的功能作用,通過簡單的案例加深對各命令功能的理解。Inventory是Ansible的核心功能點之一,本章用了約一半內容講解了Inventory的入門、書寫規范、使用技巧及其與正則的結合使用。正則作為運維必備技能與Ansible的結合也使得Ansible愈顯靈活,功能也愈顯強大,請務必熟練掌握。下章我們將為大家介紹Ansible Ad-Hoc命令集的進階使用。
- Windows Server 2019 Cookbook
- Designing Purpose:Built Drones for Ardupilot Pixhawk 2.1
- 發布!設計與部署穩定的分布式系統(第2版)
- Google系統架構解密:構建安全可靠的系統
- 精解Windows 8
- Ganglia系統監控
- Alfresco 4 Enterprise Content Management Implementation
- Python基礎教程(第3版)
- 嵌入式系統原理及開發
- AutoCAD 2014中文版從入門到精通
- Learning Magento 2 Administration
- Heroku Cloud Application Development
- 15分鐘!畫出我的漫畫角色:賣萌篇
- Docker for Developers
- Administering ArcGIS for Server