yaml介紹python
yaml是一個可讀性高的用來表達資料序列的格式,yaml參考了其餘多種語言,包括:xml,c語言,python,perl以及電子郵件格式RFC2822等,ClarkEvans在2001年在首次發表了這種語言。nginx
yaml 的縮進要求比較嚴格。必定不能使用tab鍵shell
注意:編寫yaml文件,就忘掉shell的tab吧。vim
每一個冒號後面必定要有一個空格bash
注意:1. 以冒號結尾不須要空格服務器
2.表示文件路徑的模版能夠不須要空格app
想要表示列表項,使用一個短橫槓加一個空格。多個項使用一樣的縮進級別做爲同一個列表的一部分測試
總之:ui
1. 嚴格控制空格編寫劇本的時候this
2.劇本編寫不支持tab
一、腳本名:***.yml 【不是.yml也行】
二、註釋: 「#」
三、tasks: (後不能加任何字符-能夠加註釋#)
四、- name: 一個 - name: 下不能有兩條功能(行)
5.每一個-和:即冒號以後要有一個空格,task除外。
--- ### 劇本的開頭,能夠不寫
- hosts: all <- 處理全部服務器,找到全部服務器; -(空格)hosts:(空格)all
tasks: <- 劇本所要乾的事情; (空格)(空格)task:
- command: (空格)(空格)空格)(空格)-(空格)模塊名稱:(空格)模塊中對應的功能
測試劇本命令後面能夠跟多個-v進行調試檢查
ansible-playbook --syntax-check /root/ansible/httpd.yaml
ansible-playbook -C /root/ansible/httpd.yaml
ansible-playbook /root/ansible/httpd.yaml
第一步: 編寫一個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 *:*