這是Ansible系列課程第三節(jié)僻肖,Ansible Ad-hoc命令介紹伪节。介紹一下ad-hoc命令是什么,以及幾個(gè)具體的實(shí)例逆航。
該系列課程前后章節(jié)都是有關(guān)聯(lián)性的,對(duì)于初學(xué)者建議按順序閱讀渔肩。也可以選擇特定的章節(jié)了解單個(gè)知識(shí)點(diǎn)因俐。
上一節(jié)我們完成了Ansible的基礎(chǔ)環(huán)境搭建,并且成功執(zhí)行了第一條ad-hoc命令周偎。正所謂“麻雀雖小五臟俱全”抹剩,ad-hoc命令雖然簡(jiǎn)單但也是一次完整的ansible任務(wù),對(duì)于了解Ansible以及Ansible playbook的使用也很有幫助蓉坎。這一節(jié)主要介紹一下什么是ad-hoc命令澳眷,有什么用處并且列舉幾個(gè)常見(jiàn)的使用場(chǎng)景。
什么是ad-hoc命令
ad-hoc命令是指使用/usr/bin/ansible命令行工具在一個(gè)或多個(gè)管理節(jié)點(diǎn)上執(zhí)行單個(gè)任務(wù)的命令蛉艾。這其實(shí)是一個(gè)概念性的名字钳踊,是相對(duì)于 Ansible playbook 來(lái)說(shuō)的。當(dāng)我們需要快速的完成一些任務(wù)而不需要將執(zhí)行的命令保存下來(lái)勿侯,這樣的命令就稱(chēng)為ad-hoc命令箍土。
Ansible提供兩種方式去執(zhí)行任務(wù):一種是ad-hoc 命令,另一種是寫(xiě) Ansible playbook罐监。前者可以處理一些簡(jiǎn)單的任務(wù),而后者需要處理比較復(fù)雜的任務(wù)瞒爬。ad-hoc命令與playbook的關(guān)系類(lèi)似于在命令行敲入的shell命令和shell scripts之間的關(guān)系弓柱。
ad-hoc命令雖然簡(jiǎn)單,但也展示出了Ansible的強(qiáng)大功能侧但,并且也有很多使用場(chǎng)景矢空,比如在多個(gè)遠(yuǎn)程主機(jī)上快速執(zhí)行一次性的任務(wù),或者想測(cè)試某個(gè)模塊的行為以決定是否要加入到playbook中等等禀横。
單個(gè)ad-hoc命令介紹
下面介紹一下ad-hoc命令如何使用屁药,ad-hoc命令的格式如下:
$ ansible[pattern]-m[module]-a"[module options]"
舉個(gè)例子:
$ ansibledevops-mfile-a"path=/mnt/1.txt state=touch"
這個(gè)格式包含四個(gè)主要部分:
ansible:ad-hoc命令是通過(guò)ansible執(zhí)行的,類(lèi)似于ansible-playbook執(zhí)行playbook腳本柏锄。
pattern:指定該命令要在哪些管理節(jié)點(diǎn)或者哪組管理節(jié)點(diǎn)上執(zhí)行酿箭,比如例子中的devops主機(jī)組。選擇管理節(jié)點(diǎn)或者主機(jī)組的方式有很多種趾娃,在后面章節(jié)會(huì)有介紹缭嫡。
-m [module]:指定該命令要執(zhí)行哪個(gè)模塊,比如例子中的file模塊抬闷。ansible中自帶許多模塊妇蛀,通過(guò)命令或playbook在遠(yuǎn)程管理節(jié)點(diǎn)上執(zhí)行耕突。
-a [module options]:指定該模塊執(zhí)行時(shí)所需要的選項(xiàng),比如例子中的"path=/mnt/1.txt state=touch"评架。每個(gè)模塊都包含很多功能眷茁,通過(guò)傳入不同的選項(xiàng)執(zhí)行具體的操作。
例子的含義就是:在devops主機(jī)組中通過(guò)file模塊創(chuàng)建一個(gè)路徑為/mnt/1.txt的文件纵诞。
上面格式只列出里ansible命令的幾個(gè)參數(shù)上祈,其他的更多參數(shù)可以通過(guò)執(zhí)行ansible --help命令查看。
[root@controll-node ~]# ansible --help
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
? ? ? ? ? ? ? [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
? ? ? ? ? ? ? [-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k]
? ? ? ? ? ? ? [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
? ? ? ? ? ? ? [-c CONNECTION] [-T TIMEOUT]
? ? ? ? ? ? ? [--ssh-common-args SSH_COMMON_ARGS]
? ? ? ? ? ? ? [--sftp-extra-args SFTP_EXTRA_ARGS]
? ? ? ? ? ? ? [--scp-extra-args SCP_EXTRA_ARGS]
? ? ? ? ? ? ? [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
? ? ? ? ? ? ? [-e EXTRA_VARS] [--vault-id VAULT_IDS]
[--ask-vault-pass |--vault-password-fileVAULT_PASSWORD_FILES]
? ? ? ? ? ? ? [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
? ? ? ? ? ? ? [-a MODULE_ARGS] [-m MODULE_NAME]
? ? ? ? ? ? ? pattern
Define and run a single task'playbook'against asetof hosts
positional arguments:
? pattern ? ? ? ? ? ? ? host pattern
......
默認(rèn)模塊command
ansible中的模塊很多挣磨,這里只說(shuō)一下command模塊雇逞,因?yàn)樗莂nsible命令行工具的默認(rèn)模塊,也就是說(shuō)茁裙,在執(zhí)行ansible命令時(shí)塘砸,可以不用傳入-m參數(shù)指定模塊名。比如:
#將devops主機(jī)組的服務(wù)器重啟
$ ansibledevops-a"/sbin/reboot"
command模塊的功能是有限的晤锥,該模塊不支持shell語(yǔ)法掉蔬,比如管道符、重定向矾瘾、$PATH女轿、$HOME變量等。如果我們的命令里需要使用shell語(yǔ)法壕翩,就要使用shell模塊蛉迹,這里要注意的是選項(xiàng)里單引號(hào)的用法(單引號(hào)獲取的是管理節(jié)點(diǎn)的變量,雙引號(hào)獲取的是控制節(jié)點(diǎn)的變量)放妈。從下面示例中也可以看出北救。
#這里獲取的是管理節(jié)點(diǎn)的變量
[root@controll-node ~]# ansible devops -m shell -a 'echo $HOSTNAME'
118.195.199.238 | CHANGED |rc=0>>
manage-node
#這里獲取的是控制節(jié)點(diǎn)的變量
[root@controll-node ~]# ansible devops -m shell -a "echo $HOSTNAME"
118.195.199.238 | CHANGED |rc=0>>
controll-node
舉幾個(gè)具體的實(shí)例
①管理組和用戶(hù)
利用group模塊管理用戶(hù)組,包括創(chuàng)建芜抒、刪除用戶(hù)組珍策,通過(guò)下面的命令創(chuàng)建devops用戶(hù)組:
$ ansibledevops-mgroup-a"name=devops state=present"
利用user模塊管理用戶(hù),包括創(chuàng)建宅倒、刪除和修改用戶(hù)屬性等攘宙,通過(guò)下面命令創(chuàng)建用戶(hù)devops,并將其添加到devops組中拐迁。
$ ansibledevops-muser-a'name=devops password=$6$.evG1Z/VuVrACjw.$ZrxtGWn3NCaFNGbR3195bEQgU5insiI1.H/0Sho/iIl2o1kcGka04bDA.rUPtd0pIHhfxnunAIeotzYynEqSs1 groups=devops'
②管理文件
可以利用file模塊管理文件蹭劈、目錄和鏈接,包括創(chuàng)建线召、刪除和修改屬性链方。下面通過(guò)ad-hoc命令在devops主機(jī)組創(chuàng)建一個(gè)文件,命令如下:
$ ansibledevops-mfile-a"path=/mnt/1.txt state=touch"
從結(jié)果可以看出文件創(chuàng)建成功了灶搜。默認(rèn)情況下祟蚀,ansible使用的是當(dāng)前登錄用戶(hù)工窍,那么如何用另一個(gè)用戶(hù)執(zhí)行該任務(wù)呢?ansible提供了-u選項(xiàng)指定用戶(hù)前酿。假如我們想用devops賬號(hào)創(chuàng)建該文件呢患雏,命令如下:
$ ansibledevops-mfile-a"path=/mnt/2.txt state=touch"-u devops
結(jié)果失敗了,從錯(cuò)誤信息里可以看出是沒(méi)有在/mnt下創(chuàng)建文件的權(quán)限罢维,下面我們使用sudo創(chuàng)建文件淹仑。注意:請(qǐng)確保devops用戶(hù)在sudo的組里,如果沒(méi)有肺孵,將其添加到/etc/sudoers文件中匀借,可使用visudo命令添加。在ansible中使用--become選項(xiàng)來(lái)使用sudo平窘。
$ ansibledevops-mfile-a"path=/mnt/2.txt state=touch"-u devops --become
結(jié)果又失敗了吓肋,從錯(cuò)誤信息可以看出是缺少sudo的密碼。ansible提供了--ask-become-pass選項(xiàng)輸入sudo的密碼瑰艘。
$ ansibledevops-mfile-a"path=/mnt/2.txt state=touch"-u devops --become --ask-become-pass
輸入sudo密碼后是鬼,這次終于成功了。
③管理軟件
有時(shí)候需要在管理節(jié)點(diǎn)上安裝軟件紫新,比如安裝Git均蜜,就可以利用Linux的包管理器模塊進(jìn)行安裝,CentOS平臺(tái)是yum模塊芒率,可以通過(guò)下面的命令進(jìn)行安裝:
$ ansibledevops-myum-a"name=git state=present"
如果要卸載軟件囤耳,只需要修改參數(shù)中的state值為absent即可,完整命令如下:
$ ansibledevops-myum-a"name=git state=absent"
好了偶芍,ad-hoc命令的使用場(chǎng)景先介紹到這里紫皇,更詳細(xì)的用法可以在模塊介紹里面查找。
總結(jié)
這一節(jié)介紹了ad-hoc命令的用法并通過(guò)幾個(gè)例子介紹了幾個(gè)常用的使用場(chǎng)景腋寨。可以看出化焕,ad-hoc命令就是一條簡(jiǎn)單而具體的任務(wù)萄窜,既不能保存命令也不能存儲(chǔ)結(jié)果,復(fù)雜的業(yè)務(wù)邏輯更是處理不了撒桨。而這些就需要ansible另一個(gè)強(qiáng)大的功能playbook完成的查刻,并且在使用Ansible過(guò)程中基本上就是編寫(xiě)playbook來(lái)處理復(fù)雜的場(chǎng)景。下一節(jié)詳細(xì)介紹一下inventory凤类,看看如何更好的管理主機(jī)穗泵。