Ansible的Playbook案例

playbook-劇本 介紹
playbooks是 一個不同於使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來說,playbook是一個非常簡單的配置管理和多主機部署系統,不同於任何已經存在的模式,可作爲一個適合部署複雜應用程序的基礎。Playbook可以定製配置,可以按照指定的操作步驟有序執行,支持同步和異步方式。值得注意的是playbook是通過YAML格式來進行描述定義的。

寫個playbook實現測試web節點狀態

[root@ansible ~]# vim ping.yml 
--- #固定格式
- name: 檢查主機的連通性  #name的作用添加一個註釋和說明
  hosts: web  #主機的集合
  tasks: #命令的集合 
    - name: 命令1  
      ping:
  # - name: 命令2
  #   ping: 
[root@ansible ~]# ansible-playbook ping.yml  --syntax-check
playbook: ping.yml  #表示語法正確
[root@ansible ~]# ansible-playbook ping.yml 
PLAY [檢查主機的連通性]

TASK [Gathering Facts] 
ok: [web2]
ok: [web1]

TASK [命令1]
ok: [web2]
ok: [web1]
 

user模塊的使用
利用ansible-doc 模塊名可以查看幫助,找到模塊的例子直接可以使用

[root@ansible ~]#ansible-doc user  #查看user模塊的幫助信息
[root@ansible ~]# vim user.yml 
---
- name: 創建用戶
  hosts: web
  tasks: 
    - name: 創建用戶
      user:
        name: z3
        uid: 1040
        group: users
    - name: 修改密碼
      shell: echo 123 | passwd --stdin z3
[root@ansible ~]# ansible-playbook user.yml

練習1:

  • 所有web主機安裝apache
  • 修改配置文件的監聽端口爲8080
  • 設置默認主頁爲hello world
  • 啓動服務
  • 設置開機自啓
[root@ansible ~]# vim httpd.yml
---
- name: 部署httpd
  hosts: web
  tasks:
    - name: 安裝httpd
      yum:
        name: httpd
        state: installed
    - name: 修改端口爲8080
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        insertafter: '^#Listen '
        line: 'Listen 8080'
    - name: 修改默認首頁#也可以使用copy模塊
      shell: echo 'hello world' > /var/www/html/index.html
    - name: 重啓httpd服務
      service:
        name: httpd
        state: restarted
        enabled: yes
 : ! ansible-doc 模塊名 可以不退出vim查看幫助手冊

: ! ansible-doc 模塊名 可以不退出vim查看幫助手冊

[root@ansible ~]# ansible-playbook httpd.yml  --syntax-check
playbook: user.yml
[root@ansible ~]# ansible-playbook httpd.yml 
PLAY [部署httpd] ***********************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************
ok: [web1]
ok: [web2]

TASK [安裝httpd] ***********************************************************************************************************************
changed: [web2]
changed: [web1]

TASK [修改端口爲8080] *********************************************************************************************************************
changed: [web2]
changed: [web1]

TASK [修改默認首頁#也可以使用copy模塊] ************************************************************************************************************
changed: [web1]
changed: [web2]

TASK [重啓httpd服務] *********************************************************************************************************************
changed: [web1]
changed: [web2]

PLAY RECAP ***************************************************************************************************************************
web1                       : ok=5    changed=4    unreachable=0    failed=0   
web2                       : ok=5    changed=4    unreachable=0    failed=0   

playbook語法進階

vars介紹:

  • 在palybook中使用vars 表示使用變量
  • 定義變量的格式爲key: value,變量是vars的子層所以要放在第二行寫
  • 調用變量的格式爲 “{{value}}”

實例1:

[root@ansible ~]# vim user.yml 
---
- name: 添加用戶
  hosts: web
  vars: #vars表示使用變量 
    username: l4  #格式爲key:values
  tasks:
    - name: 添加用戶 "{{username}}" #調用變量用戶"{{變量名}}"
      user:
        name: "{{username}}"
        group: users
    - name: 修改密碼
      shell: echo 123 | passwd --stdin "{{username}}"

外部向playbook傳參方法:

  • palybook裏只需要調用變量,參數由外部傳入,代碼詳情見下圖
  • 方法一 利用json語法,-e 表示調用參數
    [root@ansible ~]# ansible-playbook user.yml -e’{“username”:“dachui”}’
  • 方法二 利用yaml語法
    [root@ansible ~]# ansible-playbook user.yml -e @test.yml
[root@ansible ~]#cat test.yml
---
username: jerry

[root@ansible ~]# vim user.yml 
---
- name: 添加用戶
  hosts: web
  tasks:
    - name: 添加用戶 "{{username}}" #調用變量用戶"{{變量名}}"
      user:
        name: "{{username}}"
        group: users
    - name: 修改密碼
      shell: echo 123 | passwd --stdin "{{username}}"
 

ignore_errors的使用:

  • play中只要執行命令的返回值不爲0,就會報錯,tasks停止,可以添加下面
  • ignore_errors: True #忽略錯誤,強制返回成功

實例1:
在這裏插入圖片描述
****在這裏插入圖片描述


Tags介紹:

  • 在一個playbook中,我們一般會定義很多個task,如果我們只想執行其中的某一個task或多個task時就可以使用tags標籤功能了
[root@ansible ~]# cat user.yml 
---
- name: 修改web集羣
  hosts: web
  tasks:
    - name: 修改配置文件 
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.cnf
    - name: 修改默認首頁
      tags: conf_index  #定義標籤
      copy: src=index.html  dest=/var/www/html/index.html
    - name: 重啓服務
      service: name=httpd state=restarted enabled=true
[root@ansible ~]# ansible-playbook user.yml -t conf_index //-t 表示 tags標籤

Handlers介紹

  • handlers也是一些task的列表,和一般的task並沒有什麼區別。
  • 是由通知者進行的notify,如果沒有被notify,則Handlers不會執行,假如被notify了,則-Handlers被執行
  • 不管有多少個通知者進行了notify,等到play中的所有task執行完成之後,handlers也只會被執行一次
    在這裏插入圖片描述

when和register的使用

  • when的值是一個條件表達式,如果條件判斷成立,這個task就執行,如果判斷不成立,則task不執行
  • 在task後添加when子句即可使用條件測試
  • register用來定義一個變量,來保存變量的值
  • 可利用debug將變量裏的值全部顯示出來方便理解
[root@ansible ~]# uptime | awk -F, '{print $3}' | awk -F: '{print $2}'
 0.00
[root@ansible ~]# vim user.yml 
---
- name: 監控系統負載
  hosts: web1
  tasks:
    - name: 獲取系統負載
      shell: "uptime | awk -F, '{print $3}' | awk -F: '{print $2}'" 
      register: result #將結果保存到result中
    - name: 停止httpd服務
      service: name=httpd state=stopped
      when: result.stdout | float > 0.7  #result.stdout意思是取出標準輸出  float是將結果轉爲整數和0.7比較
    - debuge: var=result

驗證:
[root@web1 ~]# awk ‘BEGIN{while(1){}}’ & #寫個死循環觸發系統負載
[root@web1 ~]# watch uptime //持續監控
[root@web1 ~]# uptime
15:03:08 up 6:28, 1 user, load average: 0.71, 0.23, 0.12
[root@ansible ~]# ansible-playbook system.yml
with_items

  • with_items是palybook標準循環
  • 用於迭代一個列表或字典,通過{{item}}獲取每次迭代的值
  • 例如創建多個用戶並且要求各個用戶的密碼不同

實例

- name: 添加多個用戶
  hosts: web1
  tasks:
    - name: 添加用戶 "{{item.username}}"
      user:
        name: "{{item.username}}"
        group: "{{item.group}}"
        password: "{{item.password | password_hash('sha512')}}"
      with_items:
        - 
          username: bob
          group: games
          password: '123456'
        - 
          username: kenji
          group: bin
          password: qwer123
        - 
          username: ailisi
          group: adm
          password: 123qqq...A
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章