初窺Ansible playbook

Ansible是一個系列文章,我會盡可能以通俗易懂、詼諧幽默的總結方式給你們呈現這些枯燥的知識點,讓學習變的有趣一些。
Ansible系列博文直達連接:Ansible入門系列shell

前言

在上一篇文章中說到Ansible有兩種玩法,一種是Ansible Ad-Hoc,另外一種是就是這裏要說的playbook。playbook是Ansible進行配置管理的組件,雖然Ansible的平常Ad-Hoc命令功能很強大,能完成一些基本的配置管理工做,可是Ad-Hoc命令沒法支撐複雜環境的配置管理工做。在咱們實際使用Ansible的工做中,大部分時間都是在編寫playbook,接下來就重點說說如何玩轉這個playbook。apache

執行playbook命令

咱們都是按照yaml語法規則來編寫playbook,至於yaml怎麼玩,後面的文章我會總結一下的。在咱們按照要求編寫好了yaml文件後,如何來執行這個yaml文件呢?ssh

Ansible提供了一個單獨的命令:ansible-playbook命令,咱們能夠經過這個命令來執行yaml腳本。常見的ansible-playbook的使用方法以下:異步

最簡單的使用方法:學習

ansible-playbook copyDemo.yaml

咱們還可使用如下命令查看輸出的細節:設計

ansible-playbook copyDemo.yaml --verbose

咱們也可使用如下命令查看該yaml腳本將影響的主機列表:rest

ansible-playbook copyDemo.yaml --list-hosts

還可使用如下命令檢查yaml腳本語法是否正確:code

ansible-playbook copyDemo.yaml --syntax-check

上面的幾種使用方法基本就涵蓋了咱們平常工做中80%的場景了,剩餘的20%場景,好比並行、異步等,不多用到,等真正用到的時候再去查閱相關資料也來的及。而工做中,更多的時候,咱們不是在編寫playbook,就是在編寫playbook的路上。因此,接下來我重點說說如何寫這個playbook,也就是playbook的基本語法。server

playbook基本語法

最基本的playbook腳本分爲三個部分:md5

  1. 在哪些機器上以什麼身份執行
  2. 執行的任務有哪些
  3. 善後任務有哪些

咱們在編寫playbook腳本的時候,老是離不開上面的三個部分的。下面先來一個稍微有點複雜的playbook腳本,讓你們先有一個總體的認識。

---
- 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

如今就對上述三部分稍做詳細總結。

主機和用戶

上面的yaml腳本,咱們一開始就會看到hostsuservars,其中vars在後面的文章進行專門總結。而這裏的hostsuser就是表示咱們這個yaml將要在哪些主機上用哪一個用戶身份去操做。而這裏的深一層次的關係以下表所示:

key 含義
hosts 爲主機的IP,或者主機組名,或者關鍵字all
user 在遠程以哪一個身份執行
become 切換成其餘用戶身份執行,值爲yes或者no
become_method 與become一塊兒使用,值能夠爲sudo/su
become_user 與become一塊兒使用,能夠是root或者其它用戶名

在實際工做中,若是咱們不指定user時,則默認使用鏈接遠程主機的用戶進行操做,若是指定了執行用戶而與ansible_ssh_user指定用戶不一致時,則須要開啓become操做,這裏的become配置與ansible.cfg中配置將相互配合完成工做,yaml中的become優先級高於ansible.cfg中配置中的優先級。

任務列表

任務列表是整個playbook的核心,對於任務列表,咱們首先須要知道如下三點內容:

  • 任務是從上到下順序執行的,若是中間發生錯誤,那麼整個playbook會停止;
  • 每個任務都是對模塊的一次調用,只是使用不一樣的參數和變量而已;
  • 每個任務最好有一個name屬性,這樣在執行yaml腳本時,能夠看到執行進度信息。

對於任務的參數有兩種不一樣的寫法,咱們在編寫yaml腳本時,能夠按照本身的喜愛進行選擇。

寫法一:

- name: Write apache config file
  template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf

寫法二:

- name: Write apache config file
  template: 
    src: /home/test1/httpd.j2
    dest: /home/test2/httpd.conf

這兩種寫法都是OK的,我通常喜歡第二種寫法。

最後,對於任務咱們還須要特別一個點,那就是任務的執行狀態。咱們在執行Ansible Ad-Hoc或者ansible-playbook的時候,在輸出中都會有一個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

這裏的這個changed就是人物的執行狀態,可是它爲何一會是0,一會有是1呢?這就要說到Ansible中一個叫作「冪等性」的概念。

冪等性

冪等性是數學和計算機科學上一個常見的概念,屢次執行產生的結果不會發生改變,這樣的特性就被成爲冪等性。

大多數的Ansible模塊在設計時保證了冪等性,冪等性保證了Ansible腳本屢次執行狀況下的相同結果,儘量的避免使用那些不能知足冪等性的模塊。好比咱們常用的shell模塊就是非冪等性的。

咱們要明白Ansible是以「結果爲導向的」,咱們指定了一個「目標狀態」,Ansible會自動判斷「當前狀態」是否與「目標狀態」一致,若是一致,則不進行任何操做;若是不一致,那麼就將「當前狀態」變成「目標狀態」,這就是「冪等性」,「冪等性」能夠保證咱們重複的執行同一項操做時,獲得的結果是同樣的。

那這個冪等性與上面的changed又有什麼關係呢?且聽我下面慢慢道來!

  • changed爲false或者0時,表示Ansible沒有進行任何操做,沒有「改變什麼」;
  • changed爲true或者大於0時,表示Ansible執行了操做,「當前狀態」已經被Ansible改變成了「目標狀態」。

copy這個模塊來舉例子說明,當咱們準備將一個文件經過Ansible拷貝到遠程主機時,copy模塊首先檢查遠程是否已經存在了該文件,若是不存在,則把文件拷貝過去,返回changed爲大於0;若是存在時,則開始比對兩個文件的md5值,若是md5值一致,則說明兩個文件是同樣的,則不須要拷貝,此時copy模塊則什麼都不幹,返回changed爲0。

總結

經過三篇文章總結了Ansible中的經常使用模塊、Ansible Ad-Hoc和ansible-playbook的一些慣用用法,從個人實際學習經驗來講,學到這裏,你能夠將這三塊內容結合起來使用了,至少能夠在大家生產環境鼓搗一下了。生來就是折騰,更況且咱們這麼拼命、努力的學習呢!

果凍想,認真玩技術的地方。

2019年5月18日,於內蒙古呼和浩特。

相關文章
相關標籤/搜索