ansible的playbook組件

playbook的核心元素:
web

        tasks: 任務vim

        variables: 變量ssh

        templates: 模板測試

        handlers: 處理器spa

        roles: 角色
命令行

組織格式:YAML(被稱爲另一種標記語言)3d

  語法:(列表用橫杆表示,鍵值對用冒號分割,鍵值對裏又能夠嵌套另外的鍵值對)blog

例如:    name:tomrem

       age:21it

       gender:Male

       spourse:

         name:lily

         gender:female

       children:

         —    name:susan

            age: 2

            gender:female

         —    name:sunny

            age: 10

            gender:male

列表:用—引導

字典:包含多個k:v鍵值對  例如   {name:tom age:21 gender:male}   上面的表示就是一個字典,字典也能夠嵌套,如上面的

spourse下又嵌套了一個字典,而children下包含了兩個列表,每一個列表下又嵌套了一個字典  

 

建立一個playbook文件:vim /root/first.yml  (這類文件必須以.yml或.yaml結尾)

通常的格式爲:

   - hosts:

     vars: 

     remote_user:   

     tasks:

     handlers:

hosts 定義單個主機或組,vars定義變量,remote_user定義執行命令的遠程用戶,tasks定義執行哪些命令,handlers定義調用哪些

處理器

 

下圖是一個簡單示例:

如何運行我定義的劇本呢?  使用ansible-playbook命令  例如:ansible-playbook /root/first.yml

變量:

  變量命名:字母數字下劃線組成,只能以字母開頭

  變量種類:  facts(內置變量)   

       自定義變量:(1)經過命令行傳遞,(2)經過roles傳遞,(3)主機變量,(4)組變量

  facts:由遠程主機發回的主機屬性信息,這些信息被保存在ansible變量當中

  例如:ansible 192.168.238.170 -m setup  來獲取遠程主機上的屬性信息,這些屬性信息保存在facts中

 

  經過命令行傳遞:ansible-playbook test.yml --extra-vars 「host=www user=tom「(若是劇本中已有此處定義的變量則會被

覆蓋)

 

    主機變量:在/etc/ansible/hosts中定義,以下圖

  

  name=tom就是給主機192.168.238.168單獨定義的變量(主機變量)

 

  組變量:[group_name:vars]

      var1=value

      var2=value

 

inventory參數:ansible基於ssh鏈接inventory(/etc/ansible/hosts)中指定的遠程主機時,將以此處指定的屬性進行鏈接

  ansible_ssh_port 鏈接遠程主機使用的端口

  ansible_ssh_user 鏈接遠程主機使用的用戶

  ansible_ssh_pass 鏈接遠程主機使用的密碼(建議使用基於密鑰認證,而不是用此選項)

使用示例:vim /etc/ansible/hosts

 

 

第二個劇本:vim /root/second.yml

在playbook中調用變量的方式爲{{ variable }}

 

條件測試:在某task後面添加when子句便可實現條件測試功能,例如:

ansible_os_family 是facts中內置的屬性信息   ansible_os_family的信息可使用ansible all -m setup | grep

ansible_os_family 查看

 

迭代:

  在task中調用內置的item變量;在某task後面使用with_items語句來定義元素列表

 

例如:

- name: add four users

  user: name={{ item }}  state=present

  with_items:

  - testuser1

  - testuser2

  - testuser3

  - testuser4

 

迭代中,列表中的每一個元素能夠爲字典格式

例如:

- name: add two users

  user: name={{ item.name }}  state=present  groups={{ item.groups }}

  with_items:  

  - { name: 'testuser5', groups: 'wheel' }

 

  - { name: 'testuser6', groups: 'root' }

 

handlers:也是task,但只有其關注的條件知足時,纔會被觸發執行 例如:

vim /root/fourth.yml

 

上面的意思是copy中複製過去的文件跟遠程主機上的文件不一樣,就經過notify調用handlers,即重啓httpd服務

handler 重啓服務是最通用的用法

 

templates:用於生成文本文件(配置文件);模板文件中可以使用jinja2表達式,表達式要定義在{{ }},也能夠簡單地僅執行變量替

換;

使用示例: vim /etc/ansible/hosts

 

添加了http_port的變量

 

接下來:vim /root/httpd.conf 

 

Listen的端口使用 {{ http_port }},這樣是爲了調用此變量

 

接下來: vim /root/fourth.yml

 

修改copy爲template    

ansible-playbook /root/fourth.yml,這時192.168.238.168就會監聽爲8080端口,  而不是默認的80端口了

 

 

roles:roles用於實現「代碼複用」,roles以特定的層次型格式組織起來的playbook元素(variables, tasks, templates,

handlers);可被playbook以role的名字直接進行調用

roles的文件結構:

    files/:此角色中用到的全部文件均放置於此目錄中;

    templates/:Jinja2模板文件存放位置

    tasks/:任務列表文件;能夠有多個,但至少有一個叫作main.yml的文件

    handlers/:處理器列表文件;能夠有多個,但至少有一個叫作main.yml的文件

      vars/:變量字典文件;能夠有多個,但至少有一個叫作main.yml的文件

    meta/:此角色的特殊設定及依賴關係

 

例如:mkdir /etc/ansible/roles   cd /etc/ansible/roles    mkdir  web1/{files,templates,tasks,handlers,vars,meta}

 

(1)vim web1/vars/main.yml   

  

 

 (2) vim web1/tasks/main.yml

 

這裏的template指的是相對路徑-->web1/templates

 

(3) vim web1/handlers/main.yml

 

 

cp /root/httpd.conf   /etc/ansible/roles/web1/templates/

 

vim /etc/ansible/roles/web1/templates/httpd.conf

 

將User和Group都替換爲上面定義的變量

 

在roles以外定義一個調用roles的文件,vim /etc/ansible/web1.yml  這個文件的文件名必須以.yml結尾

hosts:web1 指在/etc/ansible/hosts中定義的組,上面有定義

最後的 -  web1  指的是/etc/ansible/roles/web1 目錄

這時只需更改上面的hosts指定的值就可對不一樣的主機實現代碼重用了

 

還能夠經過role傳遞變量,例如

 

 

還能夠調用多個role,例如

 

每次運行palybook都會把裏面的內容都運行一遍,而有時只想運行一些內容,這時可使用tags

vim /etc/ansible/roles/web1/tasks/main.yml

 

使用命令ansible-playbook -t conf web1.yml  就只執行定義了conf的tags的那個標籤的任務,此處就是install config file

tags能夠定義在多處

相關文章
相關標籤/搜索