簡(jiǎn)介:
Ansible是開(kāi)源工具,整個(gè)開(kāi)發(fā)過(guò)程或二次開(kāi)發(fā)均遵循GPL協(xié)議,所以所有源碼均可見(jiàn),作為一款日常工作所需的核心軟件,我們有必要知道其目錄分布及各目錄功能。
通過(guò)下列命令可以獲取ansible所有文件存放目錄
rpm -ql ansible
該命令輸出較多,大致分為如下幾類(lèi):
配置文件目錄:/etc/ansible/
執(zhí)行文件目錄:/usr/bin/
Lib庫(kù)依賴(lài)目錄:/usr/lib/pythonX.X/site-packages/ansible/
Help文檔目錄:/usr/share/doc/ansible-X.X.X/
Man文檔目錄:/usr/share/man/manl/
運(yùn)維經(jīng)常需要配置的目錄:
(1.)/etc/ansible/ 主要功能為:Inventory主機(jī)信息配置 、Ansible工具功能配置等。
(2.)執(zhí)行文件目錄/usr/bin/主要功能為:Ansible系列命令默認(rèn)存放目錄,Ansible所有的可執(zhí)行文件均存放在該目錄下。
Ansible配置文件解析
配置文件ansible.cfg約有350行語(yǔ)句,大多數(shù)為注釋行默認(rèn)配置項(xiàng)。該文件遵循INI格式分為如下幾類(lèi)配置。
(1.)[defaults]
該類(lèi)配置下定義常規(guī)的連接類(lèi)配置,如:
inventory、library、remote_tmp、local_tmp、forks、poll_interval、sudo_user、ask_sudo_pass、ask_pass、transport
remote_port等。
參數(shù)解釋?zhuān)?/strong>
[defaults] #inventory = /etc/ansible/hosts #定義Inventory #library = /usr/share/my_modules/ #自定義lib庫(kù)存放目錄 #remote_tmp = $HOME/.ansible/tmp #臨時(shí)文件遠(yuǎn)程主機(jī)存放目錄 #local_tmp = $HOME/.ansible/tmp #臨時(shí)文件本地存放目錄 #forks = 5 #默認(rèn)開(kāi)啟的并發(fā)數(shù) #poll_interval = 15 #默認(rèn)輪詢(xún)時(shí)間間隔 #sudo_user = root #默認(rèn)sudo用戶(hù) #ask_sudo_pass = True #是否需要sudo密碼 #ask_pass = True #是否需要密碼 #roles_path = /etc/ansible/roles #默認(rèn)下載的Roles存放的目錄 #host_key_checking = False #首次連接是否需要檢查key認(rèn)證,建議設(shè)為False #timeout = 10 #默認(rèn)超時(shí)時(shí)間 #timeout = 10 #如沒(méi)有指定用戶(hù),默認(rèn)使用的遠(yuǎn)程連接用戶(hù) #log_path = /var/log/ansible.log #執(zhí)行日志存放目錄 #module_name = command #默認(rèn)執(zhí)行的模塊 #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緩存的主機(jī)信息存放方式 #retry_files_enabled = False #retry_files_save_path = ~/.ansible-retry #錯(cuò)誤重啟文件存放目錄
上述是日常可能用到的配置,這些多數(shù)保持默認(rèn)即可。
(2.)[privilege_escalation]
出于安全角度考慮,部分公司不希望直接以root的高級(jí)管理員權(quán)限直接部署應(yīng)用,往往會(huì)開(kāi)放普通用戶(hù)權(quán)限并給予sudo的權(quán)限,該部分配置主要針對(duì)sudo用戶(hù)提權(quán)的配置 。
參數(shù)解釋?zhuān)?/strong>
#become = True #是否sudo #become_method=sudo #sudo 方式 #become_user=root #sudo后變?yōu)閞oot用戶(hù) #become_ask_pass=False #sudo后是否驗(yàn)證密碼
(3.)[privilege_connection] 該配置不常用到
#record_host_keys=False #不記錄新主機(jī)的key以提升效率 #pty=False #禁用sudo功能
(4.)[ssh_connection]
Ansible默認(rèn)使用的是SSH協(xié)議進(jìn)行與對(duì)端主機(jī)進(jìn)行通信。但配置項(xiàng)較少,多數(shù)默認(rèn)即可
# pipelining = False
(5.)[accelerate]
Ansible連接加速相關(guān)配置。多數(shù)保持默認(rèn)即可。 #accelerate_port = 5099 #加速連接端口 #accelerate_timeout = 30 #命令執(zhí)行超時(shí)時(shí)間,單位秒 #accelerate_connect_timeout = 5.0 #連接超時(shí)時(shí)間,單位秒 #accelerate_multi_key = yes
(6.)[selinux]
關(guān)于selinux的相關(guān)配置幾乎不會(huì)涉及,保持默認(rèn)配置即可。
#libvirt_lxc_noseclabel = yes #libvirt_lxc_noseclabel = yes
(7.)[colors]
Ansible對(duì)于輸出結(jié)果的顏色也進(jìn)行了詳盡的定義且可配置,保持默認(rèn)即可。
#highlight = white #verbose = blue #warn = bright purple #error = red #debug = dark gray #deprecate = purple #skip = cyan #unrechable = red #ok = green #changed = yellow #diff_add = green #diff_remove = red #diff_lines = cyan
Ansible命令用法詳解
Ansible命令執(zhí)行的方式有:Ad-Hoc 、Ansible-playbook兩種方式
兩者本質(zhì)沒(méi)什么區(qū)別:Ad-Hoc主要用于臨時(shí)命令的執(zhí)行,Ansible-playbook可以理解為Ad-Hoc的集合,通過(guò)一定的規(guī)則編排在一起。
Ansible認(rèn)證方式有兩種:密碼認(rèn)證、公私鑰認(rèn)證兩種方式
Ansible的命令使用格式:
ansible(主機(jī)模式) [options] (選項(xiàng))
Inventory:中的group組名、具有"." 或"*" 或 ":" 等特殊字符的匹配型字符串 。<>表示該選項(xiàng)是必須項(xiàng),不可忽略。
[options]是Ansible的參數(shù)選項(xiàng),[]表示該選項(xiàng)中的參數(shù)任選其一。
-m NAME,--module-name=NAME:指定執(zhí)行使用的模塊 -u USERNAME,--user=USERNAME:指定遠(yuǎn)程主機(jī)以USERNAME運(yùn)行命令。 -s,--sudo:相當(dāng)于Linux系統(tǒng)下的sudo命令。 -U SUDO_USERNAME,--sudo-user=SUDO_USERNAME:使用sudo,相當(dāng)于Linux下的sudo命令。
具體實(shí)例如下:
以kangshuo用戶(hù)執(zhí)行ping存活檢測(cè)
ansible all -m ping -u kangshuo
以kangshuo sudo 至root執(zhí)行ping存活檢測(cè)
ansible all -m ping -u kangshuo --sudo
以kangshuo sudo 至batman 用戶(hù)執(zhí)行ping 存活檢測(cè)
ansible all -m ping -u bruce --sudo --sudo-user batman
注意:但在新版本中ansible的sudo命令廢棄,改為–become或-b,如上命令修改為如下:
以kangshuo sudo至root執(zhí)行ping存活檢測(cè)
ansible all -m ping -u kangshuo -b
以kangshuo sudo至batman用戶(hù)執(zhí)行ping存活檢測(cè)
ansible all -m ping -u kangshuo -b --become-user batman
Ansible-playbook的命令用法和Ansible略有不同,雖然參數(shù)選項(xiàng)與Ansible有很多相同的地方,但也新增了針對(duì)Ansible-playbook特有的參數(shù)。
Ansible-playbook的命令使用格式如下:
Ansible-playbook playbook.yml
Ansible-playbook命令后跟事先編輯好的playbook.yml文件即可。Ansible-playbook新增的功能參數(shù)如下:
--ask-vault-pass:加密playbook文件時(shí)提示輸入密碼。 -D,--diff:當(dāng)更新的文件數(shù)及內(nèi)容較少時(shí),該選項(xiàng)可顯示這些文件不同的地方,該選項(xiàng)結(jié)合-C用會(huì)有較好的效果。 -e EXTRA_VARS,--extra-vars=EXTRA_VARS:在Playbook中引入外部變量。 --flush-cache:將fact清除到的遠(yuǎn)程主機(jī)緩存。 --force-handlers:強(qiáng)制運(yùn)行handlers的任務(wù),即使在任務(wù)失敗的情況下。 -i INVENTORY:指定要讀取的INventory(清單)文件。 --list-tags:列出所有可用的tags。 --list-tasks:列出所有即將被執(zhí)行的任務(wù)。 --skip-tags=SKIP_TAGS:跳過(guò)指定的tags任務(wù)。 --start-at-task=START_AT_TASK:從第幾條任務(wù)開(kāi)始執(zhí)行。 --step:逐步執(zhí)行Playbook定義的任務(wù),并經(jīng)人工確認(rèn)后繼續(xù)執(zhí)行下一步任務(wù)。 --syntax-check:檢查Playbook中的語(yǔ)法書(shū)寫(xiě)。 -t TAGS,--tags=TAGS:指定執(zhí)行該tags的任務(wù)。
Ansible系列命令用法詳解與使用場(chǎng)景介紹
如何獲取Ansible的系列命令呢?
在終端鍵入ansible后連續(xù)按兩次Tab鍵,會(huì)補(bǔ)全所有以ansible字母開(kāi)頭的命令,這些命令均是Ansible系列命令。
ansible ansible-galaxy ansible-pull ansible-doc Ansible-playbook ansible-vault ansible-console
1.ansible:
ansible主要應(yīng)用在如下場(chǎng)景:
(1.)非固化需求
(2.)臨時(shí)一次性操作
(3.)二次開(kāi)發(fā)接口調(diào)用
那么什么是非固化需求和臨時(shí)一次性操作呢?
簡(jiǎn)單來(lái)講,比如工作中我臨時(shí)想查看storm_cluster組的主機(jī)是否存活。
ansible storm_cluster -m ping
[root@192 ~]# ansible storm_cluster -m ping 192.168.1.5 | success >> { "changed": false, "ping": "pong" } 192.168.1.7 | success >> { "changed": false, "ping": "pong" }
在或者我想臨時(shí)復(fù)制本地的/etc/fstab文件到遠(yuǎn)程主機(jī)192.168.1.7的/tmp目錄下做測(cè)試。
ansible 192.168.1.7 -m copy -a "src=/etc/fstab dest=/tmp/fstab owner=root group=root mode=644 backup=yes"
執(zhí)行結(jié)果如下:
[root@192 ~]# ansible 192.168.1.7 -m copy -a "src=/etc/fstab dest=/tmp/fstab owner=root group=root mode=644 backup=yes" 192.168.1.7 | success >> { "changed": false, "dest": "/tmp/fstab", "gid": 0, "group": "root", "md5sum": "881cdcd7fca7a1dca107d264ba621358", "mode": "0644", "owner": "root", "path": "/tmp/fstab", "secontext": "unconfined_u:object_r:admin_home_t:s0", "size": 541, "state": "file", "uid": 0 }
再到192.168.1.7主機(jī)上面查看/tmp目錄下是否有fstab文件。
例如上面的這些沒(méi)規(guī)律的、臨時(shí)需要做的任務(wù),我們稱(chēng)之為非固化需求、臨時(shí)一次性操作。
Ansible的返回結(jié)果都非常友好,一般會(huì)用3種顏色來(lái)表示執(zhí)行結(jié)果:
紅色:表示執(zhí)行過(guò)程中有異常,一般會(huì)中止剩余所有的任務(wù) 綠色:表示執(zhí)行過(guò)程中沒(méi)有異常,所有任務(wù)均正常執(zhí)行 橘黃色:表示執(zhí)行過(guò)程中沒(méi)有異常,所有任務(wù)均正常執(zhí)行,但是命令執(zhí)行結(jié)束后目標(biāo)有狀態(tài)的變化。
所以判斷Ansible系列命令的執(zhí)行結(jié)果是否正常是一件非常容易的事情,只要看顏色即可。
2.ansible-galaxy
通過(guò)ansible-galaxy命令,我們可以根據(jù)下載量和關(guān)注量等信息,查找和安裝優(yōu)秀的Roles。
Roles是Ansible非常重要的一項(xiàng)功能。之后的博客會(huì)有專(zhuān)門(mén)的詳解。。。。。
在ansible-galaxy上,我們可以上傳和下載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的詳細(xì)信息。 install:下載并安裝galaxy指定的Roles到本地。 list:列出本地已下載的Roles。 remove:刪除本地已下載的Roles。
Ansible2.0版本中,針對(duì)ansible-galaxy增加了login、import、delete、setup等功能,但這些功能需要基于login在galaxy認(rèn)證成功后方可執(zhí)行,主要為了方便對(duì)galaxy上已有的Roles的配置工作。
(2.)help用法顯示[–help]
針對(duì)上面的init、info等功能,后面跟上–help可單獨(dú)顯示該項(xiàng)用法。例如:
ansible-galaxy init --help
執(zhí)行后會(huì)返回ansible-galaxy init選項(xiàng)的用法說(shuō)明。
Usage: ansible-galaxy init [options] role_name Options: -h, --help show this help message and exit -p INIT_PATH, --init-path=INIT_PATH The path in which the skeleton role will be created. The default is the current working directory. -s API_SERVER, --server=API_SERVER The API server destination -f, --force Force overwriting an existing role See 'ansible-galaxy
–help' for more information on a specific command.
其他選項(xiàng)與help用法一樣。
(3.)參數(shù)項(xiàng)[options]
該部分結(jié)合第一部分的參數(shù)完成ansible-galaxy完整的功能用法。
可參考如下:
下載用戶(hù)kangshuo的Nginx這個(gè)Role到本地并忽略錯(cuò)誤(默認(rèn)存放在/etc/ansible/roles/)
ansible-galaxy --ignore-errors install azavea.git
因?yàn)閍nsible-galaxy是對(duì)https://galaxy.ansible.com網(wǎng)站的上傳、下載、配置類(lèi)工作,如果有類(lèi)似如下報(bào)錯(cuò),請(qǐng)確保該網(wǎng)站可以正常訪(fǎng)問(wèn)。
The API server (galaxy.ansible.com) is not responding, please try again later.
3.ansible-pull
該指令的使用涉及Ansible的另一種工作模式:pull模式(Ansible默認(rèn)使用push模式)。
push模式適用于以下場(chǎng)景:
(1.)你有數(shù)量巨大的機(jī)器需要配置,即使使用高并發(fā)線(xiàn)程依舊要花費(fèi)很多時(shí)間。
(2.)你要在剛啟動(dòng)的、沒(méi)有網(wǎng)絡(luò)連接的主機(jī)上運(yùn)行Ansible。
ansible-pull命令的使用格式如下:
ansible-pull [options] [playbook.yml]
通過(guò)ansible-pull結(jié)合Git和crontab一并實(shí)現(xiàn),其原理如下:通過(guò)crontab定期拉去指定的Git版本到本地,并以指定模式自動(dòng)運(yùn)行預(yù)先制訂好的指令。
具體參考如下實(shí)例:
*/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通常在配置大批量機(jī)器的場(chǎng)景下使用,靈活性稍有欠缺,但效率幾乎可以無(wú)限提升,對(duì)運(yùn)維人員的技術(shù)水平和前瞻性規(guī)劃有較高要求。
4.ansible-doc
ansible-doc是Ansible模塊文檔說(shuō)明,針對(duì)每個(gè)模塊都有詳細(xì)的用法說(shuō)明及應(yīng)用案例介紹,功能和Linux系統(tǒng)man命令類(lèi)似。
該命令使用方式如下:
ansible-doc [options] [module...]
ansible-doc命令后跟[options]參數(shù)或[模塊名],顯示模塊用法說(shuō)明。具體示例如下:
ansible-doc -l #列出支持的模塊
[root@192 ~]# ansible-doc -l acl Sets and retrieves file ACL information. add_host add a host (and alternatively a group) to the ansible-playbo airbrake_deployment Notify airbrake about app deployments alternatives Manages alternative programs for common commands apache2_module enables/disables a module of the Apache2 webserver apt Manages apt-packages apt_key Add or remove an apt key apt_repository Add and remove APT repositories apt_rpm apt_rpm package manager arista_interface Manage physical Ethernet interfaces arista_l2interface Manage layer 2 interfaces arista_lag Manage port channel (lag) interfaces arista_vlan Manage VLAN resources assemble Assembles a configuration file from fragments assert Fail with custom message at Schedule the execution of a command or script file via the a authorized_key Adds or removes an SSH authorized key azure create or terminate a virtual machine in azure bigip_facts Collect facts from F5 BIG-IP devices bigip_monitor_http Manages F5 BIG-IP LTM http monitors bigip_monitor_tcp Manages F5 BIG-IP LTM tcp monitors bigip_node Manages F5 BIG-IP LTM nodes bigip_pool Manages F5 BIG-IP LTM pools bigip_pool_member Manages F5 BIG-IP LTM pool members boundary_meter Manage boundary meters bzr Deploy software (or files) from bzr branches campfire Send a message to Campfire capabilities Manage Linux capabilities cloudformation create a AWS CloudFormation stack command Executes a command on a remote node composer Dependency Manager for PHP copy Copies files to remote locations. cpanm Manages Perl library dependencies. cron Manage cron.d and crontab entries. datadog_event Posts events to DataDog service debconf Configure a .deb package debug Print statements during execution
ansible-doc ping //模塊功能說(shuō)明
[root@192 ~]# ansible-doc ping > PING A trivial test module, this module always returns `pong' on successful contact. It does not make sense in playbooks, but it is useful from `/usr/bin/ansible' # Test 'webservers' status ansible webservers -m ping
5.Ansible-playbook
ansible-playbook工作機(jī)制:通過(guò)讀取預(yù)先編寫(xiě)好的playbook文件實(shí)現(xiàn)批量管理。
要實(shí)現(xiàn)的功能與ansible命令一樣,可以理解為按一定條件組成的ansible任務(wù)集。
ansible-playbook命令后跟YML格式的playbook文件,執(zhí)行事先編好的任務(wù)集。
使用方式如下:
ansible-playbook playbook.yml
具體示例如下:
ansible-playbook gw.yml
playbook具有編寫(xiě)簡(jiǎn)單、可定制性高、靈活方便,以及可固化日常所有操作的特點(diǎn),運(yùn)維人員應(yīng)熟練掌握。
6.ansible-vault
ansible-vault主要用于配置文件加密,例如編寫(xiě)的playbook配置文件中包含敏感信息,不希望其他人隨意查看,ansible-vault可加密/解密這個(gè)配置文件。
具體示例如下:
首先編輯一個(gè)a.yml文件,里面內(nèi)容為了測(cè)試隨便輸入即可,輸入aaaaaaaaa
保存退出,加密a.yml文件。
ansible-vault encrypt a.yml
會(huì)有以下輸入加密密碼提示:
Vault password: Confirm Vault password: Encryption successful
設(shè)置完,這時(shí)再打開(kāi)a.yml文件后會(huì)發(fā)現(xiàn)該文件亂碼:
只有通過(guò)如下命令解密后方可正常查看。
ansible-vault decrypt a.yml
輸入預(yù)設(shè)的密碼后方可解密
Vault password: Decryption successful
此時(shí)a.yml文件打開(kāi)后可正常查看:
7.ansible-console
ansible-console是Ansible為用戶(hù)提供的一款交互式工具,用戶(hù)可以在ansible-console虛擬出來(lái)的終端上像Shell一樣使用Ansible內(nèi)置的各種命令,這為習(xí)慣于使用shell交互方式的用戶(hù)提供了良好的使用體驗(yàn)。
到這里,我們對(duì)ansible的用法及系列命令已經(jīng)有了概念性的了解和掌握,接下來(lái)我們進(jìn)一步了解Ansible Inventory(清單)文件的配置管理。
Ansible Inventory(清單) 配置及詳解
Inventory(清單)是Ansible管理主機(jī)信息的配置文件,相當(dāng)于系統(tǒng)HOSTS文件的功能,默認(rèn)存放在/etc/ansible/hosts。
為了方便批量管理主機(jī),便捷使用其中的主機(jī)分組,Ansible通過(guò)Inventory來(lái)定義主機(jī)和組。
在使用時(shí)通過(guò)-i或者–inventory-file指定讀取,與Ansible命令結(jié)合使用時(shí)組合如下:
ansible -i /etc/ansible/hosts storm_cluster -m ping
讀取結(jié)果如下:
注意:如果只有一個(gè)Inventory(清單)時(shí)可不用指定路徑,默認(rèn)讀取/etc/ansible/hosts。Inventory(清單)可以同時(shí)存在多個(gè),而且支持動(dòng)態(tài)生成
Inventory(清單)的使用規(guī)則(定義主機(jī)和組)
Inventory(清單)配置文件遵循INI文件風(fēng)格,中括號(hào)中的字符為組名。其支持將同一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中,分組的功能為IT人員維護(hù)主機(jī)列表提供了非常大的便利。
此外,若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口,還可以在主機(jī)名稱(chēng)之后使用冒號(hào)加端口號(hào)來(lái)表名,以行為單位分隔配置
詳細(xì)代碼信息注釋內(nèi)容:
# “ # ” 開(kāi)頭的行表示該行為注釋行,即當(dāng)時(shí)行的配置不生效。 # Inventory(清單)可以直接為IP地址 192.168.1.7 #Inventory(清單)同樣支持Hostname(主機(jī)名)的方式,后跟冒號(hào)加數(shù)字表示端口號(hào),默認(rèn)22號(hào)端口 ntp.magede.com:22 nfs.magede.com:22 # 中括號(hào)內(nèi)的內(nèi)容表示一個(gè)分組的開(kāi)始,緊隨其后的主機(jī)均屬于該組成員,空行后的主機(jī)亦屬于該組,即web2.magedu.com這臺(tái)主機(jī)也屬于[webservers]組。 [webservers] web1.magedu.com web[10:20].magedu.com #[10:20] 表示10 ~ 20 之間的所有數(shù)字(包括10和20 ),即表示web10.magedu.com、web11.magedu.com.................web20.magedu.com的所有主機(jī)。 web2.magedu.com[dbservers] db-a.magedu.com db-[b:f].magedu.com # [b:f] 表示b到f之間的所有數(shù)字(包括b和f),即表示db-b.magedu.com、db-c.magedu.com..........db-f.magedu.com的所有主機(jī)。
定義主機(jī)變量
在平時(shí)工作中,通常會(huì)遇到非標(biāo)準(zhǔn)化的需求配置,如考慮到安全性問(wèn)題,業(yè)務(wù)人員通常將企業(yè)內(nèi)部的web服務(wù)80端口修改為其他端口號(hào),而該功能可以直接通過(guò)修改Inventory(清單)配置來(lái)實(shí)現(xiàn),在定義主機(jī)時(shí)為其添加主機(jī)變量,以便在Playbook中使用針對(duì)某一主機(jī)的個(gè)性化要求。
例如:
[webservers] web1.magedu.com http_port=808 maxRequestsPerChild=801 #自定義http_port的端口號(hào)為808、配置maxRequestsPerChild為801.
Ansible其實(shí)支持多種方式修改或自定義變量,Inventory(清單)是其中的一種修改方式。關(guān)于更多種方式,將在后期會(huì)詳細(xì)介紹到的。。。。。。。。
定義組變量
Ansible支持定義組變量,主要是針對(duì)大量機(jī)器的變量定義需求,賦予指定組內(nèi)所有主機(jī)在Playbook中可用的變量,等同于逐一給該組下的所有主機(jī)賦予同一變量。
例如:
[groupservers] web1.magedu.com web2.magedu.com [groupservers:vars] ntp_server=ntp.magedu.com #定義groupservers組中所有主機(jī)ntp_server值為ntp.magedu.com nfs_server=nfs.magedu.com #定義groupservers組中的所有主機(jī)nfs_server值為nfs.magedu.com
定義組嵌套及組變量
Inventory(清單)中,組還可以包含其他的組(嵌套),并且也可以向組中的主機(jī)指定變量。不過(guò),這些變量只能在Ansible-playbook中使用,而Ansible不支持。組與組之間可以相互調(diào)用,并且可以向組中的主機(jī)指定變量。
示例:
[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以簡(jiǎn)單為其核心理念,上述實(shí)現(xiàn)在業(yè)務(wù)日常使用中并不常見(jiàn),大家了解其用法即可。
多重變量定義
變量除了可以在Inventory(清單)中一并定義,也可以獨(dú)立于Inventory(清單)文件之外單獨(dú)存儲(chǔ)到Y(jié)AML格式的配置文件中,這些文件中,這些文件通常以.yml、.yaml、.json為后綴或者無(wú)后綴。
變量通常從如下4個(gè)位置檢索:
Inventory(清單)配置文件(默認(rèn)/etc/ansible/hosts) Playbook中vars定義的區(qū)域 Roles中的vars目錄下的文件 Roles同級(jí)目錄group_vars和hosts_vars目錄下的文件
假設(shè)foosball主機(jī)同屬于raleigh和webservers組,那么其變量在如下文件中設(shè)置均有效:
/etc/ansible/group_vars/raleigh # can optionally end in '.yml' ,'.yaml' , or '.json' /etc/ansible/group_vars/webservers /etc/ansible/host_vars/foosball
對(duì)于變量的讀取,Ansible遵循如上優(yōu)先級(jí)順序,因此大家設(shè)置變量時(shí)盡量沿用同一種方式,以方便維護(hù)人員管理。
其他Inventory(清單)參數(shù)列表
除了支持如上的功能外,Ansible基于SSH連接Inventory(清單)中指定的遠(yuǎn)程主機(jī)時(shí),還內(nèi)置了很多其他參數(shù),用于指定其交互方式。
下面列舉了部分重要參數(shù):
ansible_ssh_host:指定連接主機(jī)ansible_ssh_port,指定SSH連接端口,默認(rèn)22 ansible_ssh_user:指定SSH連接用戶(hù) ansible_ssh_pass:指定SSH連接密碼 ansible_sudo_pass:指定SSH連接時(shí)sudo密碼 ansible_ssh_private_key_file:指定特有私鑰文件
其他內(nèi)置參數(shù)還有數(shù)十個(gè), 這些參數(shù)均可以直接寫(xiě)在命令行或Playbook文件中,以覆蓋配置文件中的定義。
Ansible與正則
正則表達(dá)式(Patterns)是各類(lèi)高級(jí)語(yǔ)言的必定支持的方法之一,Ansible也不例外。其Patterns(模式)功能等同于正則表達(dá)式,語(yǔ)法使用也和正則類(lèi)同,這大大便利了運(yùn)維的使用。
該功能同樣支持Ansible-playbook,其用法也非常簡(jiǎn)單,語(yǔ)法如下:
ansible-m -a
該功能主要針對(duì)Inventory(清單)的主機(jī)列表使用。
如下示例中主要針對(duì)webservers進(jìn)行正則匹配:
重啟webservers組所有主機(jī)的httpd服務(wù)
ansible webservers -m service -a "name=httpd state=restarted"
(1.)ALL(全量)匹配
匹配所有主機(jī),all或*號(hào)功能相同,但*號(hào)需引起來(lái)。如檢測(cè)所有主機(jī)存活情況
ansible all -m ping ansible "*" -m ping
檢查192.168.1.0/24網(wǎng)段所有主機(jī)存活狀況
ansible 192.168.1.* -m ping
(2.)邏輯或(or)匹配
如果我們希望同時(shí)對(duì)多臺(tái)主機(jī)或多個(gè)組同時(shí)執(zhí)行,相互之間用":"(冒號(hào))分隔即可。
ansible "web1:web2" -m ping
(3.)邏輯非(!)匹配
邏輯非用感嘆號(hào)(?。┍硎?,主要針對(duì)多重條件的匹配規(guī)則,使用方式如下:
所有在webservers組但不在Phoenix組的主機(jī)
webservers:!Phoenix
(4.)邏輯與(&)匹配
和邏輯非一樣,邏輯與也主要針對(duì)多重條件的匹配規(guī)則,只是邏輯上的判斷不同。邏輯與使用&表示,請(qǐng)看如下示例:
webservers組和staging組中同時(shí)存在的主機(jī)
webservers:&staging
(5.)多條件組合
Ansible同樣支持多條件的復(fù)雜組合,該情況企業(yè)應(yīng)用不多,這里做簡(jiǎn)單舉例說(shuō)明。
webservers和dbservers兩個(gè)組中的所有主機(jī)在staging組中存在且在Phoenix組中不存在的主機(jī)
webservers:dbservers:&staging:!Phoenix
(6.)模糊匹配
*通配符在Ansible表示0個(gè)或多個(gè)任意字符,主要應(yīng)用于一些模糊規(guī)則匹配,在平時(shí)的使用中應(yīng)用頻率非常高,請(qǐng)參考如下示例:
所有以.magedu.com結(jié)尾的主機(jī)均符合
*.magedu.com
one開(kāi)頭.com結(jié)尾的所有主機(jī)和dbservers組中的所有主機(jī)
one*.com:dbservers
(7.)域切割
Ansible底層基于python,因此也支持域切割。Python字符串域切割的示例如下:
str = '12345678' print = str[0:1]
通過(guò)[0:1]即可獲取數(shù)值1.該功能在Ansible中也支持,以如下Inventory(清單)內(nèi)容為例:
[webservers] cobweb webbing weber
通過(guò)上面截取數(shù)組下標(biāo)可以獲取到對(duì)應(yīng)變量值。
webservers[0] # == cobweb webservers[-1] # == weber webservers[0:1] # == cobweb,webbing webservers[1:] # == webbing,weber
(8.)正則匹配
Ansible同樣完整支持正則匹配功能,"~"開(kāi)始表示正則匹配。
~(web|db).*.example.com
檢測(cè)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
關(guān)于Ansible的正則功能到此結(jié)束,相信大家在瀏覽的過(guò)程中對(duì)其靈活程度也會(huì)有所感觸,在對(duì)Ansible的實(shí)際應(yīng)用過(guò)程中也會(huì)不斷地加深對(duì)其理解。