playbook概述 playbook遠端分發 、 playbook遠端執行
一、playbook基礎
1.1 ansible七種武器
1.1.1 ad-doc
– ansible 命令,用於執行臨時性的工作.
1.1.2 ansible-doc
– ansible-doc 是 Ansible模組文件說明,針對每個模組 都有詳細的用法說明及應用案例介紹,功能和Linux系 統man命令類似,必須掌握
1.1.3 ansible-console
– ansible-console 是 Ansible 為使用者提供的一款互動 式工具,使用者可以在 ansible-console 虛擬出來的終 端上像 Shell 一樣使用 Ansible 內建的各種命令, 這為習慣於使用 Shell 互動方式的使用者提供了良好的 使用體驗。
1.1.4 ansible-galaxy
– ansible-galaxy 從 github 上下載管理 Roles 的一款 工具,與 python 的 pip 類似。
1.1.5 ansible-playbook
– ansible-playbook 是日常應用中使用頻率最高的命令, 其工作機制是:通過讀取預先編寫好的 playbook 文 件實現批量管理。要實現的功能與命令 ansible 一樣, 可以理解為按一定條件組成的 ansible 任務集。
1.1.6 ansible-vault
– ansible-vault 主要用於配置檔案加密,如編寫的 Playbook 配置檔案中包含敏感資訊,不希望其他人隨 意檢視, ansible-vault 可加密/解密這個配置檔案
1.1.7 ansible-pull
– Ansible 有兩種工作模式 pull/push ,預設使用 push 模式工作,pull 模式和通常使用的 push 模式工作機 理剛好相反 – 適用場景:有數量巨大的機器需要配置,即使使用高併發執行緒依舊要花費很多時間,
通常在配置大批量機器的場景下會使用
1.2 json簡介
1.2.1 什麼是 json
– json 是 JavaScript 物件表示法,它是一種基於文字, 獨立於語言的輕量級資料交換格式。 – JSON中的分隔符限於單引號 ’ 、小括號 ()、中括號 [ ]、大括號 { } 、冒號 : 和逗號 ,
1.2.2 json 特性
1. JSON 是純文字 2.JSON 具有層級結構(值中存在值) 3.JSON 可通過 JavaScript 進行解析
1.2.3 json 語法規則
1.資料在名稱/值對中 2.資料由逗號分隔 3.大括號儲存物件 4.中括號儲存陣列
1.2.4 json的書寫格式
1.JSON基本格式
– “鍵”:”值”
“帥哥”:“李俊”
2. json 陣列格式
{ “愛好”: [“籃球”, “檯球”, “旅遊”,”撩妹”] }
3.複合複雜型別
{ “dogs”:
[ {“name”:”laifu”,”color”:”black”},
{“name”:”ahuang”,”color”:”yellow”},
{“name”:”jiawang”,”color”:”red”}
]
}
1.3 yaml簡介
1.3.1 什麼是yaml
yaml是一個可讀性高,用來表達資料序列的格式
1.3.2 yaml 基礎語法
– YAML的結構通過空格來展示 – 陣列使用”- ”來表示 – 鍵值對使用”: ”來表示 – YAML使用一個固定的縮排風格表示資料層級結構關係 – 一般每個縮排級別由兩個以上空格組成 – # 表示註釋 • 注意: – 不要使用tab,縮排是容易出錯的地方之一 – 同一層級縮排必須對齊
1.3.3 YAML的鍵值表示方法
1 採用冒號分隔 2 : 後面必須有一個空格 3. YAML鍵值對例子
“帥哥”: “李俊”
或
“帥哥”:
“李俊”
4.複雜YAML的鍵值對巢狀
“dogs”:
“name”:”laifu”
或
“dogs”:
“name”:
“laifu”
5.陣列
[“籃球”, “檯球”, “旅遊”,”撩妹”]
6.YAML 陣列表示方法 – 使用一個短橫槓加一個空格 – YAML 陣列例子 - “籃球” - “檯球” - “旅遊” - “撩妹”
7. 雜湊陣列複合表示式 “愛好”: - “籃球” - “檯球” - “旅遊” - “撩妹”
1.4 jinja2模版簡介
1.4.1 什麼是jinja2
– Jinja2是基於python的模板引擎,包含 變數 和 表達 式兩部分,這兩者在模板求值的時候會被替換為值。 模板中還有標籤,控制模板的邏輯。
– playbook 的模板使用 python 的 jinja2 模組來處理的
1.4.2 jinja2 模版基本語法
– 模板的表示式都是包含在分隔符 “{{ }}” 內的; – 控制語句都是包含在分隔符 “{% %}” 內的; – 另外,模板也支援註釋,都是包含在分隔符 “{# #}” 內,支援塊註釋。
1.5 playbook
1.5.1 什麼是playbook
– playbook 是 ansible 用於配置,部署,和管理託管主 機的劇本。通過 playbook 的詳細描述,執行其中的一系 列 tasks,可以讓遠端主機達到預期的狀態。
1.5.2 playbook語法
– playbook由 YAML 語言編寫,遵循 YAML 標準 – 在同一行中,#之後的內容表示註釋 – 同一個列表中的元素應該保持相同的縮排 – playbook 由一個或多個 play 組成 – play 中 hosts,variables,roles,tasks 等物件的表示 方法都是鍵值中間以 “: ” 分隔表示
– 所有的 YAML 檔案開始行都應該是 —. 這是 YAML 格式的一部分, 表明一個檔案的開始
1.5.3 playbook 構成
– Target: 定義將要執行 playbook 的遠端主機組 – Variable: 定義 playbook 執行時需要使用的變數 – Tasks: 定義將要在遠端主機上執行的任務列表 – Handler: 定義 task 執行完成以後需要呼叫的任務
1.5.4 Playbook執行結果
– 使用 ansible-playbook 執行playbook檔案,得到輸 出內容為 JSON 格式。並且由不同顏色組成,便於識 別。一般而言 – 綠色代表執行成功 – ***代表系統代表系統狀態發生改變 – 紅色代表執行失敗
1.5.5 第一個playbook
1.ping所有主機的playbook
— # 第一行,表示開始 - hosts: all remote_user: root tasks: - ping: ~ ] #ansible-playbook myping.yml -f 5 # -f 併發程序數量,預設是 5
2.playbook引數說明:
2.1. hosts 行的內容是一個或多個組或主機的 patterns,以 逗號為分隔符 2.2 remote_user 就是賬戶名 2.3 tasks – 每一個 play 包含了一個 task 列表(任務列表). – 一個 task 在其所對應的所有主機上(通過 host pattern 匹配的所有主機)執行完畢之後,下一個 task 才會執行.
1.5.6 編寫playbook
• 編寫 playbook 實現以下效果 – 安裝 apache – 修改 apache 監聽的埠為 8080 – 為 apache 增加 ServerName 配置 – 設定預設主頁 hello world – 啟動服務 – 設定開機自啟動
注:要使用ansible-doc 模組名 檢視幫助文件;
- —
- - hosts: web
- remote_user: root
- tasks:
- - name: install the latest version of Apache
- yum:
- name: httpd
- state: installed
- - lineinfile:
- path: /etc/httpd/conf/httpd.conf
- regexp: ‘^Listen ‘
- line: ‘Listen 8080’
- - lineinfile:
- path: /etc/httpd/conf/httpd.conf
- regexp: ‘^#ServerName’
- line: ‘ServerName localhost’
- - copy:
- src: /root/index.html
- dest: /var/www/html/index.html
- owner: apache
- group: apache
- mode: 0644
- - service:
- name: httpd
- state: started
- enabled: yes
二、playbook進階
2.1 語法進階
2.1.1 變數
– 給所有主機新增使用者 xiaolv,設定預設密碼 123456 – 要求第一次登入修改密碼(使用變數)
- ---
- - hosts: cache
- remote_user: root
- vars:
- username: xiaolv
- tasks:
- - name: create user
- shell: adduser {{username}}
- - shell: echo 123456 |passwd --stdin {{username}}
- - shell: chage -d 0 {{username}}
附:user 模組的 password 設定的密碼無法登入系統 1.經過測試發現,password 是把字串直接寫入 shadow,並沒有改變,而 Linux 的 shadow 密碼是 經過加密的,所以不能使用 2.解決方案: – 變數過濾器 password_hash – {{ ‘urpassword’ | password_hash(‘sha512’)}} - name: name={{username}} password={{‘123456’ |password_hash(‘sha512’)}}
2.1.2 error
1.ansible-playbook 對錯誤的處理 – 預設情況判斷 $?,如果 值 不為 0 就停止執行 – 但某些情況我們需要忽略錯誤繼續執行
需求:給所有web主機新增使用者 xiaolv,如果存在就設定預設密碼 123456
如果不存在就新增xiaolv使用者並設定密碼為123456
- ---
- - hosts: web
- remote_user: root
- vars:
- username: "zhang3"
- tasks:
- - shell: adduser "{{username}}"
- ignore_errors: True #忽略錯誤
- - shell: echo 123123 |passwd --stdin "{{username}}"
- - shell: chage -d 0 "{{username}}"
2.1.3 handlers
1.多個 task 觸發同一個 notify 的時候,同一個服務只會觸發一次
等所有的task執行完成後,handlers才會被觸發。
2.notify 可以觸發多個條件,在生產環境中往往涉及到 某一個配置檔案的改變要重啟若干服務的場景, handler 用到這裡非常適合. 3. 結合 vars 可以寫出非常普適的服務管理指令碼
— - hosts: cache remote_user: root tasks: - name: install the latest version of Apache yum: name: httpd state: installed notify: - boot start - restart httpd - lineinfile: path: /etc/httpd/conf/httpd.conf regexp: ‘^Listen ‘ insertafter: ‘^#Listen ‘ line: ‘Listen 8080’ notify: - restart httpd - lineinfile: path: /etc/httpd/conf/httpd.conf regexp: ‘^#ServerName’ line: ‘ServerName localhost’ notify: - restart httpd - copy: src: index.html dest: /var/www/html/index.html owner: apache group: apache mode: 0644 handlers: - name: restart httpd service: name: httpd state: restarted - name: boot start service: name: httpd enabled: yes
2.1.4 when
1.when的使用場景
• 某些時候我們可能需要在滿足特定的條件後在觸發某 一項操作,或在特定的條件下終止某個行為,這個時 候我們就需要進行條件判斷,when 正是解決這個問 題的最佳選擇,遠端中的系統變數 facts 變數作為 when 的條件,這些 facts 我們可以通過 setup 模組 檢視
2.根據系統使用不同的安裝命令 — - name: Install VIM hosts: all tasks: - name: Install VIM via yum yum: name=vim-enhanced state=installed when: ansible_os_family == “RedHat” - name: Install VIM via apt apt: name=vim state=installed when: ansible_os_family == “Debian”
2.1.5 register
register 模組儲存前一個命令的返回狀態,在後面進行呼叫。
1.變數註冊 – 例如我們需要判斷 lijun 這個使用者是否存在 – 如果存在我就修改密碼,如果不存在就跳過 tasks: - shell: id {{username}} register: result - name: change “{{username}}” password user: password={{‘12345678’|password_hash(‘sha512’)}} name={{username}} when: result
2.變數註冊進階 – 我們還可以針對執行命令結果的返回值做判定 – 當系統負載超過一定值的時候做特殊處理
把負載高的web伺服器停止 — - hosts: web remote_user: root tasks: - shell: uptime |awk ‘{printf(“%.2f”,$(NF-2))}’ register: result - service: name=httpd state=stopped when: result.stdout|float > 0.7 追加 debug 除錯資訊 - name: Show debug info debug: var=ooxx
測試命令 awk ‘BEGIN{while(1){}}’
2.1.6 with_items
1.with_items列表迴圈
with_items 是 playbook 標準迴圈,最常用到的就 是它,with_items 可以用於迭代一個列表或字典, 通過{{ item }}獲取每次迭代的值
2.迴圈新增多使用者 — - hosts: db2 remote_user: root tasks: - name: create user user: name: “{{item.name}}” password: “{{item.pwd|password_hash(‘sha512’)}}” group: “{{item.group}}” with_items: - { name: “user1”, pwd: “aa”, group: “users” } - { name: “user2”, pwd: “bb”, group: “mail” } - { name: “user3”, pwd: “cc”, group: “wheel” } - { name: “user4”, pwd: “dd”, group: “root” }
2.1.7 with_nested
1.巢狀迴圈 — - hosts: cache remote_user: root vars: un: [a, b, c] id: [1, 2, 3] tasks: - name: add users shell: echo {{item}} with_nested: - “{{un}}” - “{{id}}”
2.1.8 tags
1. tags:給指定的任務定義一個呼叫標識; 2.使用格式: – name: NAME – module: arguments – tags: TAG_ID 3. playbook 呼叫方式 – -t TAGS, –tags=TAGS – –skip-tags=SKIP_TAGS – –start-at-task=START_AT 4.tags樣例: vars: soft: httpd tasks: - name: install {{soft}} yum: name={{soft}} - name: config httpd.conf copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/httpd.conf - name: config services service: enabled=yes state=restarted name={{soft}} tags: restartweb • 呼叫方式 ansible-playbook i.yml –tags=restartweb
2.1.9 include and roles
1. 我們在編寫 playbook 的時候隨著專案越來越大, playbook 也越來越複雜,修改起來也越來越麻煩。 這時候可以把一些 play、task 或 handler 放到其他 檔案中,然後通過include指令包含進來是一個不錯 的選擇 tasks: - include: tasks/setup.yml - include: tasks/users.yml user=plj #users.yml 中可以通過 {{ user }}來使用這些變數 handlers: - include: handlers/handlers.ymlinclude and roles
2. roles 像是加強版的 include,他可以引入一個專案 的檔案和目錄 2.1 一般所需的目錄層級有 – vars 變數層 – tasks 任務層 – handlers 觸發條件 – files 檔案 – template 模板 – default 預設,優先順序最低
2.2 假如有一個play包含了一個叫 “x” 的role,則 — - hosts: host_group roles: - x – x/tasks/main.yml – x/vars/main.yml – x/handler/main.yml – x/… …/main.yml – 都會自動新增進這個 play
2.2 除錯
1.playbook 書寫起來容易出錯,且排錯困難,這裡介紹幾種簡單的排錯 除錯方法 – 檢測語法 ansible-playbook –syntax-check playbook.yaml – 測試執行 ansible-playbook -C playbook.yaml – 顯示收到影響到主機 –list-hosts – 顯示工作的 task –list-tasks – 顯示將要執行的 tag –list-tags
2.debug 模組可以在執行時輸出更為詳細的資訊,來 幫助我們排錯,debug 使用樣例: — - hosts: 192.168.1.16 remote_user: root tasks: - shell: uptime |awk ‘{printf(“%f\n”,$(NF-2))}’ register: result - shell: touch /tmp/isreboot when: result.stdout|float > 0.5 - name: Show debug info debug: var=result