Ansible是一個系列文章,我會盡可能以通俗易懂、詼諧幽默的總結方式給你們呈現這些枯燥的知識點,讓學習變的有趣一些。
Ansible系列博文直達連接:Ansible入門系列shell
在上一篇文章中說到Ansible有兩種玩法,一種是Ansible Ad-Hoc,另外一種是就是這裏要說的playbook。playbook是Ansible進行配置管理的組件,雖然Ansible的平常Ad-Hoc命令功能很強大,能完成一些基本的配置管理工做,可是Ad-Hoc命令沒法支撐複雜環境的配置管理工做。在咱們實際使用Ansible的工做中,大部分時間都是在編寫playbook,接下來就重點說說如何玩轉這個playbook。apache
咱們都是按照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腳本分爲三個部分:md5
咱們在編寫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腳本,咱們一開始就會看到hosts
、user
和vars
,其中vars
在後面的文章進行專門總結。而這裏的hosts
和user
就是表示咱們這個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的核心,對於任務列表,咱們首先須要知道如下三點內容:
對於任務的參數有兩種不一樣的寫法,咱們在編寫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日,於內蒙古呼和浩特。