Ansible是一個(gè)系列文章,我會(huì)盡量以通俗易懂、詼諧幽默的總結(jié)方式給大家呈現(xiàn)這些枯燥的知識(shí)點(diǎn)嚣州,讓學(xué)習(xí)變的有趣一些咕痛。
Ansible系列博文直達(dá)鏈接:Ansible入門(mén)系列
前言
在上一篇文章中說(shuō)到Ansible有兩種玩法,一種是Ansible Ad-Hoc扣甲,另一種是就是這里要說(shuō)的playbook。playbook是Ansible進(jìn)行配置管理的組件,雖然Ansible的日常Ad-Hoc命令功能很強(qiáng)大救崔,能完成一些基本的配置管理工作,但是Ad-Hoc命令無(wú)法支撐復(fù)雜環(huán)境的配置管理工作捏顺。在我們實(shí)際使用Ansible的工作中六孵,大部分時(shí)間都是在編寫(xiě)playbook,接下來(lái)就重點(diǎn)說(shuō)說(shuō)如何玩轉(zhuǎn)這個(gè)playbook幅骄。
執(zhí)行playbook命令
我們都是按照yaml語(yǔ)法規(guī)則來(lái)編寫(xiě)playbook劫窒,至于yaml怎么玩,后面的文章我會(huì)總結(jié)一下的拆座。在我們按照要求編寫(xiě)好了yaml文件后主巍,如何來(lái)執(zhí)行這個(gè)yaml文件呢?
Ansible提供了一個(gè)單獨(dú)的命令:ansible-playbook
命令挪凑,我們可以通過(guò)這個(gè)命令來(lái)執(zhí)行yaml腳本孕索。常見(jiàn)的ansible-playbook
的使用方法如下:
最簡(jiǎn)單的使用方法:
ansible-playbook copyDemo.yaml
我們還可以使用以下命令查看輸出的細(xì)節(jié):
ansible-playbook copyDemo.yaml --verbose
我們也可以使用以下命令查看該yaml腳本將影響的主機(jī)列表:
ansible-playbook copyDemo.yaml --list-hosts
還可以使用以下命令檢查yaml腳本語(yǔ)法是否正確:
ansible-playbook copyDemo.yaml --syntax-check
上面的幾種使用方法基本就涵蓋了我們?nèi)粘9ぷ髦?0%的場(chǎng)景了,剩余的20%場(chǎng)景岖赋,比如并行檬果、異步等,很少用到唐断,等真正用到的時(shí)候再去查閱相關(guān)資料也來(lái)的及选脊。而工作中,更多的時(shí)候脸甘,我們不是在編寫(xiě)playbook恳啥,就是在編寫(xiě)playbook的路上。所以丹诀,接下來(lái)我重點(diǎn)說(shuō)說(shuō)如何寫(xiě)這個(gè)playbook钝的,也就是playbook的基本語(yǔ)法。
playbook基本語(yǔ)法
最基本的playbook腳本分為三個(gè)部分:
- 在哪些機(jī)器上以什么身份執(zhí)行
- 執(zhí)行的任務(wù)有哪些
- 善后任務(wù)有哪些
我們?cè)诰帉?xiě)playbook腳本的時(shí)候铆遭,總是離不開(kāi)上面的三個(gè)部分的硝桩。下面先來(lái)一個(gè)稍微有點(diǎn)復(fù)雜的playbook腳本,讓大家先有一個(gè)整體的認(rèn)識(shí)枚荣。
---
- hosts: server1
user: root
vars:
http_port: 80
max_clients: 200
tasks:
- name: Write apache config file
template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
notify:
- restart apache
- name: Ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
現(xiàn)在就對(duì)上述三部分稍作詳細(xì)總結(jié)碗脊。
主機(jī)和用戶(hù)
上面的yaml腳本,我們一開(kāi)始就會(huì)看到hosts
橄妆、user
和vars
衙伶,其中vars
在后面的文章進(jìn)行專(zhuān)門(mén)總結(jié)祈坠。而這里的hosts
和user
就是表示我們這個(gè)yaml將要在哪些主機(jī)上用哪個(gè)用戶(hù)身份去操作。而這里的深一層次的關(guān)系如下表所示:
key | 含義 |
---|---|
hosts | 為主機(jī)的IP矢劲,或者主機(jī)組名赦拘,或者關(guān)鍵字all |
user | 在遠(yuǎn)程以哪個(gè)身份執(zhí)行 |
become | 切換成其他用戶(hù)身份執(zhí)行,值為yes或者no |
become_method | 與become一起使用芬沉,值可以為sudo /su 等 |
become_user | 與become一起使用躺同,可以是root或者其它用戶(hù)名 |
在實(shí)際工作中,如果我們不指定user
時(shí)花嘶,則默認(rèn)使用連接遠(yuǎn)程主機(jī)的用戶(hù)進(jìn)行操作笋籽,如果指定了執(zhí)行用戶(hù)而與ansible_ssh_user
指定用戶(hù)不一致時(shí),則需要開(kāi)啟become
操作椭员,這里的become
配置與ansible.cfg中配置將相互配合完成工作车海,yaml中的become優(yōu)先級(jí)高于ansible.cfg中配置中的優(yōu)先級(jí)。
任務(wù)列表
任務(wù)列表是整個(gè)playbook的核心隘击,對(duì)于任務(wù)列表侍芝,我們首先需要知道以下三點(diǎn)內(nèi)容:
- 任務(wù)是從上到下順序執(zhí)行的,如果中間發(fā)生錯(cuò)誤埋同,那么整個(gè)playbook會(huì)中止州叠;
- 每一個(gè)任務(wù)都是對(duì)模塊的一次調(diào)用,只是使用不同的參數(shù)和變量而已凶赁;
- 每一個(gè)任務(wù)最好有一個(gè)name屬性咧栗,這樣在執(zhí)行yaml腳本時(shí),可以看到執(zhí)行進(jìn)度信息虱肄。
對(duì)于任務(wù)的參數(shù)有兩種不同的寫(xiě)法致板,我們?cè)诰帉?xiě)yaml腳本時(shí),可以按照自己的喜好進(jìn)行選擇咏窿。
寫(xiě)法一:
- name: Write apache config file
template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
寫(xiě)法二:
- name: Write apache config file
template:
src: /home/test1/httpd.j2
dest: /home/test2/httpd.conf
這兩種寫(xiě)法都是OK的斟或,我一般喜歡第二種寫(xiě)法。
最后集嵌,對(duì)于任務(wù)我們還需要特別一個(gè)點(diǎn)萝挤,那就是任務(wù)的執(zhí)行狀態(tài)。我們?cè)趫?zhí)行Ansible Ad-Hoc或者ansible-playbook的時(shí)候根欧,在輸出中都會(huì)有一個(gè)changed
字段怜珍,比如:
192.168.1.3 : ok=2 changed=0 unreachable=0 failed=0
或者
192.168.1.3 : ok=2 changed=1 unreachable=0 failed=0
這里的這個(gè)changed
就是人物的執(zhí)行狀態(tài),但是它為什么一會(huì)是0凤粗,一會(huì)有是1呢酥泛?這就要說(shuō)到Ansible中一個(gè)叫做“冪等性”的概念。
冪等性
冪等性是數(shù)學(xué)和計(jì)算機(jī)科學(xué)上一個(gè)常見(jiàn)的概念,多次執(zhí)行產(chǎn)生的結(jié)果不會(huì)發(fā)生改變揭璃,這樣的特性就被成為冪等性。
大多數(shù)的Ansible模塊在設(shè)計(jì)時(shí)保證了冪等性亭罪,冪等性保證了Ansible腳本多次執(zhí)行情況下的相同結(jié)果瘦馍,盡可能的避免使用那些不能滿(mǎn)足冪等性的模塊。比如我們經(jīng)常使用的
shell
模塊就是非冪等性的应役。
我們要明白Ansible是以“結(jié)果為導(dǎo)向的”情组,我們指定了一個(gè)“目標(biāo)狀態(tài)”,Ansible會(huì)自動(dòng)判斷“當(dāng)前狀態(tài)”是否與“目標(biāo)狀態(tài)”一致箩祥,如果一致院崇,則不進(jìn)行任何操作;如果不一致袍祖,那么就將“當(dāng)前狀態(tài)”變成“目標(biāo)狀態(tài)”底瓣,這就是“冪等性”,“冪等性”可以保證我們重復(fù)的執(zhí)行同一項(xiàng)操作時(shí)蕉陋,得到的結(jié)果是一樣的捐凭。
那這個(gè)冪等性與上面的changed
又有什么關(guān)系呢?且聽(tīng)我下面慢慢道來(lái)凳鬓!
- 當(dāng)
changed
為false或者0時(shí)茁肠,表示Ansible沒(méi)有進(jìn)行任何操作,沒(méi)有“改變什么”缩举; - 當(dāng)
changed
為true或者大于0時(shí)垦梆,表示Ansible執(zhí)行了操作,“當(dāng)前狀態(tài)”已經(jīng)被Ansible改變成了“目標(biāo)狀態(tài)”仅孩。
拿copy
這個(gè)模塊來(lái)舉例子說(shuō)明托猩,當(dāng)我們準(zhǔn)備將一個(gè)文件通過(guò)Ansible拷貝到遠(yuǎn)程主機(jī)時(shí),copy
模塊首先檢查遠(yuǎn)程是否已經(jīng)存在了該文件杠氢,如果不存在站刑,則把文件拷貝過(guò)去,返回changed
為大于0鼻百;如果存在時(shí)绞旅,則開(kāi)始比對(duì)兩個(gè)文件的md5值,如果md5值一致温艇,則說(shuō)明兩個(gè)文件是一樣的因悲,則不需要拷貝,此時(shí)copy
模塊則什么都不干勺爱,返回changed
為0晃琳。
總結(jié)
通過(guò)三篇文章總結(jié)了Ansible中的常用模塊、Ansible Ad-Hoc和ansible-playbook的一些慣用用法,從我的實(shí)際學(xué)習(xí)經(jīng)驗(yàn)來(lái)說(shuō)卫旱,學(xué)到這里人灼,你可以將這三塊內(nèi)容結(jié)合起來(lái)使用了,至少可以在你們生產(chǎn)環(huán)境鼓搗一下了顾翼。生來(lái)就是折騰投放,更何況我們這么拼命、努力的學(xué)習(xí)呢适贸!
果凍想灸芳,認(rèn)真玩技術(shù)的地方。
2019年5月18日拜姿,于內(nèi)蒙古呼和浩特烙样。