1. 程式人生 > >自動化運維工具ansible Playbook介紹(二)

自動化運維工具ansible Playbook介紹(二)

nec 註意 ddr 連接 文件中 可用 ges use sta

一.playbook介紹
playbook是由一個或多個"play"組成的列表。play的主要功能在於將事先歸並為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。其主要有以下四部分構成:

playbooks組成:
Target section: 定義將要執行 playbook 的遠程主機組
Variable section: 定義 playbook 運行時需要使用的變量
Task section: 定義將要在遠程主機上執行的任務列表

Handler section: 定義 task 執行完成以後需要調用的任務
而其對應的目錄層為五個,如下:

一般所需的目錄層有:(視情況可變化)
vars 變量層
tasks 任務層
handlers 觸發條件
files 文件
template 模板

二.每一部分介紹
1.Hosts和Users
playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的用戶身份執行任務。

hosts:用於指定要執行指定任務的主機其可以是一個或多個由冒號分隔主機組。

remote_user :用於指定遠程主機上的執行任務的用戶。不過remote_user也可用於各task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務其可用於play全局或某任務。此外甚至可以在sudo時使用sudo_user指定sudo時切換的用戶。

user:於remote_user相同

sudo:如果設置為yes,執行該任務組的用戶在執行任務的時候,獲取root權限

sudo_user:如果設置user為breeze,sudo為yes,sudo_user為bernie時,則breeze用戶在執行任務時會獲得bernie用戶的權限

connection:通過什麽方式連接到遠程主機,默認為ssh

gather_facts:除非明確說明不需要在遠程主機上執行setup模塊,否則默認自動執行。如果確實不需要setup模塊傳遞過來的變量,則可以將該選項設置為False

2.變量模塊
vars

  • 名稱:‘值‘
    vars_file

vars_prompt

3.任務列表和action
play的主體部分是任務列表。

任務列表中的各任務按次序逐個在hosts中指定的所有主機上執行即在所有主機上完成第一個任務後再開始第二個。在自上而下運行某playbook時如果中途發生錯誤,所有已執行任務都將回滾因此在更正playbook後重新執行一次即可。 

task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味著多次執行是安全的,因為其結果均一致。每個task都應該有其name用於            playbook的執行結果輸出,建議其內容盡可能清晰地描述任務執行步驟。如果未提供name則action的結果將用於輸出。 

定義task的可以使用"action: module options"或"module: options"的格式,推薦使用後者以實現向後兼容。如果action一行的內容過多也可使用在行首使用幾個空白字符進行換行。

4.handlers
用於當關註的資源發生變化時采取一定的操作。
"notify"這個action可用於在每個play的最後被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之僅在所有的變化發生完成後一次性地執行指定操作。
在notify中列出的操作稱為handler也即notify中調用handler中定義的操作。

註意:在notify中定義內容一定要和tasks中定義的 - name 內容一樣,這樣才能達到觸發的效果,否則會不生效。

三.Playbook常用模塊
1.template
在實際應用中,我們的配置文件有些地方可能會根據遠程主機的配置的不同而有稍許的不同,template可以使用變量來接收遠程主機上setup收集到的facts信息,針對不同配置的主機,定制配置文件。用法大致與copy模塊相同。

常用參數:

backup:如果原目標文件存在,則先備份目標文件

dest:目標文件路徑

force:是否強制覆蓋,默認為yes

group:目標文件屬組

mode:目標文件的權限

owner:目標文件屬主

src:源模板文件路徑

validate:在復制之前通過命令驗證目標文件,如果驗證通過則復制

以下例子區分template和copy的區別

技術分享圖片

以dns配置文件為例,配置文件中有很多變量

[root@server1 ansible]# cd test/
[root@server1 test]# ls
files template.retry template.yml
[root@server1 test]# vim files/named.conf.j2

options {

listen-on port 53 {

127.0.0.1;

{% for ip in ansible_all_ipv4_addresses %}

{{ ip }};

{% endfor %}

};

listen-on-v6 port 53 { ::1; };

directory "/var/named";

dump-file "/var/named/data/cache_dump.db";

statistics-file "/var/named/data/named_stats.txt";

memstatistics-file "/var/named/data/named_mem_stats.txt";

};

zone "." IN {

type hint;

file "named.ca";

};

include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";

{# Variables for zone config #}

{% if ‘authorativenames‘ in group_names %}

{% set zone_type = ‘master‘ %}

{% set zone_dir = ‘data‘ %}

{% else %}

{% set zone_type = ‘slave‘ %}

{% set zone_dir = ‘slaves‘ %}

Playbook文件,傳一份template任務文件和copy任務文件
[root@server1 test]# ls
files template.retry template.yml
[root@server1 test]# vim template.yml
[root@server1 test]# cat template.yml

  • hosts: web_nginx

    tasks:

    • template: src=files/named.conf.j2 dest=/etc/named.conf
    • copy: src=files/named.conf.j2 dest=/etc/named.conf2

執行
[root@server1 test]# ansible-playbook template.yml
查看兩種模塊傳過來的文件
技術分享圖片

技術分享圖片

可以看出template將變量已經替換,copy原封不動的把文件復制過來
其中的變量由setup模塊取出來的

自動化運維工具ansible Playbook介紹(二)