初窺Ansible playbook

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è)部分:

  1. 在哪些機(jī)器上以什么身份執(zhí)行
  2. 執(zhí)行的任務(wù)有哪些
  3. 善后任務(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橄妆、uservars衙伶,其中vars在后面的文章進(jìn)行專(zhuān)門(mén)總結(jié)祈坠。而這里的hostsuser就是表示我們這個(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)蒙古呼和浩特烙样。

關(guān)注果凍想
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蕊肥,隨后出現(xiàn)的幾起案子谒获,更是在濱河造成了極大的恐慌,老刑警劉巖晴埂,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件究反,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡儒洛,警方通過(guò)查閱死者的電腦和手機(jī)精耐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)琅锻,“玉大人卦停,你說(shuō)我怎么就攤上這事∧张睿” “怎么了惊完?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)处硬。 經(jīng)常有香客問(wèn)我小槐,道長(zhǎng),這世上最難降的妖魔是什么荷辕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任凿跳,我火速辦了婚禮,結(jié)果婚禮上疮方,老公的妹妹穿的比我還像新娘控嗜。我一直安慰自己,他們只是感情好骡显,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布疆栏。 她就那樣靜靜地躺著曾掂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壁顶。 梳的紋絲不亂的頭發(fā)上珠洗,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音若专,去河邊找鬼险污。 笑死,一個(gè)胖子當(dāng)著我的面吹牛富岳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拯腮,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窖式,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了动壤?” 一聲冷哼從身側(cè)響起萝喘,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琼懊,沒(méi)想到半個(gè)月后阁簸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼丈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年启妹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醉旦。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饶米,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出车胡,到底是詐尸還是另有隱情檬输,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布匈棘,位于F島的核電站丧慈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏主卫。R本人自食惡果不足惜逃默,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望队秩。 院中可真熱鬧笑旺,春花似錦、人聲如沸馍资。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乌妙,卻和暖如春使兔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藤韵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工虐沥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泽艘。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓欲险,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匹涮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子天试,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355