1. 程式人生 > >playbook概述 playbook遠端分發 、 playbook遠端執行

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 模組名  檢視幫助文件;

  1. - hosts: web
  2.   remote_user: root
  3.   tasks:
  4.     - name: install the latest version of Apache
  5.       yum:
  6.         name: httpd
  7.         state: installed
  8.     - lineinfile:
  9.         path: /etc/httpd/conf/httpd.conf
  10.         regexp: ‘^Listen ‘
  11.         line: ‘Listen 8080’
  12.     - lineinfile:
  13.         path: /etc/httpd/conf/httpd.conf
  14.         regexp: ‘^#ServerName’
  15.         line: ‘ServerName localhost’
  16.     - copy:
  17.         src: /root/index.html
  18.         dest: /var/www/html/index.html
  19.         owner: apache
  20.         group: apache
  21.         mode: 0644
  22.     - service:
  23.         name: httpd
  24.         state: started
  25.         enabled: yes

二、playbook進階

2.1 語法進階

2.1.1 變數

– 給所有主機新增使用者 xiaolv,設定預設密碼 123456 – 要求第一次登入修改密碼(使用變數)

  1. ---
  2. - hosts: cache
  3. remote_user: root
  4. vars:
  5. username: xiaolv
  6. tasks:
  7. - name: create user
  8. shell: adduser {{username}}
  9. - shell: echo 123456 |passwd --stdin {{username}}
  10. - 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

  1. ---
  2. - hosts: web
  3.   remote_user: root
  4.   vars:
  5.     username: "zhang3"
  6.   tasks:
  7.     - shell: adduser "{{username}}"
  8.       ignore_errors: True #忽略錯誤
  9.     - shell: echo 123123 |passwd --stdin "{{username}}"
  10.     - 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