Ansible第二章:palybook介紹與使用--小白博客

playbook

  • tasks
  • variables
  • templates
  • handlers
  • roles

yaml介紹python

  yaml是一個可讀性高的用來表達資料序列的格式,yaml參考了其餘多種語言,包括:xml,c語言,python,perl以及電子郵件格式RFC2822等,ClarkEvans在2001年在首次發表了這種語言。nginx

  • yaml的可讀性好
  • yaml和腳本語言的交互性好
  • yaml使用實現語言的數據類型
  • yaml有一個一致的信息模型
  • yaml易於實現
  • yaml能夠基於流程來處理
  • yaml表達能力強,擴展性好

Ansible劇本編寫說明

 

一. 縮進

    yaml 的縮進要求比較嚴格。必定不能使用tab鍵shell

    注意:編寫yaml文件,就忘掉shell的tab吧。vim

 

二. 冒號

每一個冒號後面必定要有一個空格bash

注意:1. 以冒號結尾不須要空格服務器

           2.表示文件路徑的模版能夠不須要空格app

 

三. 短橫線  -

    想要表示列表項,使用一個短橫槓加一個空格。多個項使用一樣的縮進級別做爲同一個列表的一部分測試

總之:ui

1. 嚴格控制空格編寫劇本的時候this

2.劇本編寫不支持tab

 

Ansible書寫規範

 

一. 注意點

一、腳本名:***.yml   【不是.yml也行】

二、註釋:  「#」

三、tasks: (後不能加任何字符-能夠加註釋#)

四、- name: 一個 - name: 下不能有兩條功能(行)

5.每一個-和:即冒號以後要有一個空格,task除外。

 

二.  劇本格式

---                     ### 劇本的開頭,能夠不寫

- hosts: all         <- 處理全部服務器,找到全部服務器;  -(空格)hosts:(空格)all

  tasks:            <- 劇本所要乾的事情;  (空格)(空格)task:

   - command:     (空格)(空格)空格)(空格)-(空格)模塊名稱:(空格)模塊中對應的功能

測試劇本命令後面能夠跟多個-v進行調試檢查

 

Ansible劇本經常使用命令

 

1 .對劇本語法檢測

ansible-playbook --syntax-check  /root/ansible/httpd.yaml

 

2.-C模擬執行劇本

ansible-playbook  -C /root/ansible/httpd.yaml

 

3.執行劇本

ansible-playbook   /root/ansible/httpd.yaml

 

Ansible劇本實例

 

實例一:安裝httpd並啓動

第一步: 編寫一個httpdin.yaml劇本,劇本內容以下

複製代碼
[root@ken ~]# vim httpdin.yaml
- hosts: all
  tasks:
   - name: install httpd
     yum: name=httpd state=present
   - name: start httpd
     service: name=httpd state=started
複製代碼

 

第二步:語法檢測

檢測沒有問題

[root@ken ~]# ansible-playbook --syntax-check httpdin.yaml 

playbook: httpdin.yaml

 

第三步:模擬執行劇本

複製代碼
[root@ken ~]# ansible-playbook -C httpdin.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138]

TASK [install httpd] ***********************************************************************************************************
ok: [10.220.5.138]
changed: [10.220.5.139]

TASK [start httpd] *************************************************************************************************************
changed: [10.220.5.139]
ok: [10.220.5.138]

PLAY RECAP *********************************************************************************************************************
10.220.5.138               : ok=3    changed=0    unreachable=0    failed=0   
10.220.5.139               : ok=3    changed=2    unreachable=0    failed=0   
複製代碼

第四步:執行劇本

通過上面的模擬執行,並不會真的執行腳本,下面咱們來進行真正的執行

複製代碼
[root@ken ~]# ansible-playbook  httpdin.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.138]
ok: [10.220.5.139]

TASK [install httpd] ***********************************************************************************************************
ok: [10.220.5.138]
changed: [10.220.5.139]

TASK [start httpd] *************************************************************************************************************
ok: [10.220.5.138]
changed: [10.220.5.139]

PLAY RECAP *********************************************************************************************************************
10.220.5.138               : ok=3    changed=0    unreachable=0    failed=0   
10.220.5.139               : ok=3    changed=2    unreachable=0    failed=0   
複製代碼

 

第五步:檢查是否已經安裝並啓動成功

執行表名httpd安裝並啓動成功

[root@ken ~]# ansible all -m shell -a "ss -tnl | grep 80"
10.220.5.139 | SUCCESS | rc=0 >>
LISTEN     0      128         :::80                      :::*                  

10.220.5.138 | SUCCESS | rc=0 >>
LISTEN     0      128         :::80                      :::*                  

通過上面的五步,就能夠安裝任意軟件及啓動了,前提是你須要配置好你的yum源。你來試一下安裝nginx吧!

 

實例二:使用處理器

在上面的實例中,咱們已經能夠安裝軟件了。如今有這樣一個需求,若是咱們更改了節點的配置文件須要重啓操做,其他動做照常執行怎麼解決?

第一步:本地準備一個httpd配置文件,更改端口號爲8081

[root@ken ~]# cp /etc/httpd/conf/httpd.conf ./
[root@ken ~]# sed -i "s/Listen 80/Listen 8081/" httpd.conf 

 

第二步:編寫劇本

劇本說明:

- hosts: all 指定主機組,能夠理解爲這個最大,頂個寫

  tasks:       指定下面一系列的動做,這個是第二,須要有兩個空格

    - name: 指定名稱,排行第三,須要有三到四個空格

      yum: 模塊名 排行第四,須要有四到五個空格

  handlers:指定處理器(觸發器),排行第二,須要與tasks對齊

複製代碼
- hosts: all
  tasks:
   - name: install httpd
      yum: name=httpd state=present
   - name: copy file
     copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
       - restart httpd
   - name: start httpd
     service: name=httpd state=present
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted
複製代碼

 

第三步:劇本語法檢測

劇本檢測報如下錯誤,說明排版有問題

複製代碼
[root@ken ~]# ansible-playbook --syntax-check httpdhe.yaml 
ERROR! Syntax Error while loading YAML.
  mapping values are not allowed in this context

The error appears to have been in '/root/httpdhe.yaml': line 4, column 11, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

  - name: install httpd
       yum: name=httpd state=present
          ^ here
複製代碼

 

 第四步:排查錯誤

能夠發現第四行yum多縮進了一個空格,必定要嚴格控制縮進。

tasks和hosts首字母對齊

模塊和name對齊首字母

複製代碼
- hosts: all
  tasks:
   - name: install httpd
     yum: name=httpd state=present
   - name: copy file
     copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
       - restart httpd
   - name: start httpd
     service: name=httpd state=present
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted
複製代碼

 

第五步:執行劇本

注意看執行過程,中間有一步RUNNING HANDLER,說明已經出發了處理器進行了重啓操做

複製代碼
[root@ken ~]# ansible-playbook httpdhe.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138]

TASK [install httpd] ***********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138]

TASK [copy file] ***************************************************************************************************************
changed: [10.220.5.139]
changed: [10.220.5.138]

TASK [start httpd] *************************************************************************************************************
ok: [10.220.5.138]
ok: [10.220.5.139]

RUNNING HANDLER [restart httpd] ************************************************************************************************
changed: [10.220.5.139]
changed: [10.220.5.138]

PLAY RECAP *********************************************************************************************************************
10.220.5.138               : ok=5    changed=2    unreachable=0    failed=0   
10.220.5.139               : ok=5    changed=2    unreachable=0    failed=0   
複製代碼

 

第六步:檢查端口

上面咱們已經把配置文件的端口改爲8081了,檢查下節點啓動的是不是8081

能夠發現節點中的8081已經啓動

[root@ken ~]# ansible all -m shell -a "ss -tnl | grep 8081" 
10.220.5.139 | SUCCESS | rc=0 >>
LISTEN     0      128         :::8081                    :::*                  

10.220.5.138 | SUCCESS | rc=0 >>
LISTEN     0      128         :::8081                    :::*                  

 

實例三:劇本中使用判斷

劇本中可使用when來進行判斷

如今咱們再主機名爲ken1的節點之上建立一個用戶tang

第一步:域名解析

確保本機以及節點之上能夠解析IP和域名

root@ken ~]# echo "10.220.5.138 ken1" >>/etc/hosts

 

第二步:編寫劇本

ansible_fqdn是一個變量,能夠用以下命令看到,表示的是主機名

[root@ken ~]# ansible 10.220.5.138 -m setup | grep ansible_fqdn
        "ansible_fqdn": "ken1", 

在編寫劇本的時候ken1即主機名須要加上雙引號或者單引號,不然會報錯

- hosts: all
  tasks:
   - name: useradd tang
     user: name=tang uid=566 system=yes
     when: ansible_fqdn ==  "ken1"

 

第三步:語法檢測

[root@ken ~]# ansible-playbook --syntax-check useradd.yaml 

playbook: useradd.yaml

 

第四步:執行劇本

能夠看到10.220.5.139跳過了

複製代碼
[root@ken ~]# ansible-playbook useradd.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138]

TASK [useradd tang] ************************************************************************************************************
skipping: [10.220.5.139]
changed: [10.220.5.138]

PLAY RECAP *********************************************************************************************************************
10.220.5.138               : ok=2    changed=1    unreachable=0    failed=0   
10.220.5.139               : ok=1    changed=0    unreachable=0    failed=0   

[root@ken ~]# vim useradd.yaml
複製代碼

 

第五步:檢測是否執行成功

能夠發如今主機10.220.5.138上面已經有了用戶tang

[root@ken ~]# ansible all -m shell -a "id tang"
10.220.5.139 | FAILED | rc=1 >>
id: tang: no such usernon-zero return code

10.220.5.138 | SUCCESS | rc=0 >>
uid=566(tang) gid=566(tang) groups=566(tang)

 

實例四:劇本中使用循環

劇本中的循環使用with_items,使用item引用變量

變量的引用格式是 {{ 變量 }}

第一步:建立劇本

複製代碼
- hosts: all
  tasks:
    - name: useradd ding
      user: name="ding{{item}}"
      with_items:
        - a1
        - a2
        - a3
        - a4
複製代碼

 

第二步:語法檢測

[root@ken ~]# ansible-playbook --syntax-check user.yaml 

playbook: user.yaml

 

第三步:執行劇本

複製代碼
[root@ken ~]# ansible-playbook user.yaml

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138]

TASK [useradd ding] ************************************************************************************************************
changed: [10.220.5.138] => (item=a1)
changed: [10.220.5.139] => (item=a1)
changed: [10.220.5.138] => (item=a2)
changed: [10.220.5.139] => (item=a2)
changed: [10.220.5.138] => (item=a3)
changed: [10.220.5.139] => (item=a3)
changed: [10.220.5.138] => (item=a4)
changed: [10.220.5.139] => (item=a4)

PLAY RECAP *********************************************************************************************************************
10.220.5.138               : ok=2    changed=1    unreachable=0    failed=0   
10.220.5.139               : ok=2    changed=1    unreachable=0    failed=0   
複製代碼

 

第四步:查看執行結果

能夠發現用戶已經建立完畢

複製代碼
[root@ken ~]# ansible all -m shell -a "tail -5 /etc/passwd"
10.220.5.139 | SUCCESS | rc=0 >>
wukong:x:1002:234::/home/wukong:/bin/bash
dinga1:x:1003:1003::/home/dinga1:/bin/bash
dinga2:x:1004:1004::/home/dinga2:/bin/bash
dinga3:x:1005:1005::/home/dinga3:/bin/bash
dinga4:x:1006:1006::/home/dinga4:/bin/bash

10.220.5.138 | SUCCESS | rc=0 >>
tang:x:566:566::/home/tang:/bin/bash
dinga1:x:1002:1002::/home/dinga1:/bin/bash
dinga2:x:1003:1003::/home/dinga2:/bin/bash
dinga3:x:1004:1004::/home/dinga3:/bin/bash
dinga4:x:1005:1005::/home/dinga4:/bin/bash
複製代碼

 

自我感受這個循環很low,若是建立1000個用戶難道須要這樣寫- a1 -a2 -a3...-a1000個嗎?

 

實例五:劇本中使用變量

自定義變量的實現方式

1. 直接寫在yaml文件中

2. 在Inventory file中定義

3. 變量的聲明:

vars:

 - 變量名: 變量值

4. 變量的引用:{{ var }}

5. vars和tasks同級,並要寫在tasks前面

 

下面的劇本定義了一個變名爲pkgname 變量值爲mariadb-server, 變量名爲sername,變量值爲mariadb兩個變量

第一步:建立劇本

複製代碼
- hosts: all
  vars:
    - pkgname: mariadb-server
    - sername: mariadb
  tasks:
    - name: install mariadb
      yum: name={{ pkgname }} state=present
    - name: start mariadb
      service: name={{ sername }} state=started
複製代碼

 

第二步:語法檢測

[root@ken ~]# ansible-playbook --syntax-check mariadb.yaml 

playbook: mariadb.yaml

 

第三步:執行劇本

複製代碼
[root@ken ~]# ansible-playbook mariadb.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138]

TASK [install mariadb] *********************************************************************************************************
ok: [10.220.5.138]
ok: [10.220.5.139]

TASK [start mariadb] ***********************************************************************************************************
changed: [10.220.5.138]
changed: [10.220.5.139]

PLAY RECAP *********************************************************************************************************************
10.220.5.138               : ok=3    changed=1    unreachable=0    failed=0   
10.220.5.139               : ok=3    changed=1    unreachable=0    failed=0   
複製代碼

 

第四步:檢測劇本是否執行成功

[root@ken ~]# ansible all -m shell -a "ss -tnl| grep 3306"
10.220.5.139 | SUCCESS | rc=0 >>
LISTEN     0      50           *:3306                     *:*                  

10.220.5.138 | SUCCESS | rc=0 >>
LISTEN     0      50           *:3306                     *:*   
相關文章
相關標籤/搜索