Playbook的用法
目錄
Playbook
?Playbook 與 Ad-Hoc 對比
YAML 語言特性
YAML語法簡介
支持的數據類型? ?
寫法格式??
1 scalar 標量? 建議縮進兩個空格,可多
2 Dictionary 字典
3 List 列表
三種常見的數據格式
?Playbook 核心組件? 不要用 tab 可以#注釋
hosts
remote_user 組件? ?指定賬戶默認root
nginx安裝?#默認會去files文件里找 把文件放里面不用加前面的
?性能優化
方法1
?方法2
register 注冊變量
在主機清單中定義主機和主機組的變量
變量的優先級從高到低如下
?Template 模板
jinja2語言
template? ? 專門存放模板文件
?template中使用流程控制 for 和 if
for 循環
?if 條件判斷
?使用循環迭代
迭代 loop (with_items)
until 循環
with_lines 逐行處理?
條件判斷 when
分組 block
關閉 changed 狀態
利用 changed_when 檢查task返回結果
滾動執行
?委派至其它主機執行
只執行一次
環境變量?
Yaml 文件的相互調用
import_playbook??由一個yml統一調用
Roles 角色
roles目錄結構:?
Roles各目錄作用
Playbook
- ?一個 playbook(劇本)文件是一個YAML語言編寫的文本文件
- 通常一個playbook只包括一個play ,但可以包括多個Play
- 一個 play的主要包括兩部分: 主機和tasks. 即實現在指定一組主機上執行一個tasks定義好的任務列 表。
- 一個tasks中可以有一個或多個task任務 每一個Task本質上就是調用ansible的一個module
- 在復雜場景中,一個playbook中也可以包括多個play,實現對多組不同的主機執行不同的任務
?Playbook 與 Ad-Hoc 對比
- Playbook是對多個 AD-Hoc 的一種編排組合的實現方式
- Playbook能控制任務執行的先后順序
- Playbook可以持久保存到文件中從而方便多次調用運行,而Ad-Hoc只能臨時運行。
- Playbook適合復雜的重復性的任務,而Ad-Hoc適合做快速簡單的一次性任務
YAML 語言特性
- YAML的可讀性好
- YAML和腳本語言的交互性好
- YAML使用實現語言的數據類型
- YAML有一個一致的信息模型
- YAML易于實現
- YAML可以基于流來處理
- YAML表達能力強,擴展性好?
YAML語法簡介
- 在單一文件第一行,用連續三個連字號"-" 開始,還有選擇性的連續三個點號( ... )用來表示文件的結 尾
- 次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
- 使用#號注釋代碼
- 縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換 行來實現的
- 縮進不支持tab,必須使用空格進行縮進
- 縮進的空格數不重要,只要相同層級的元素左對齊即可
- YAML文件內容是區別大小寫的,key/value的值均需大小寫敏感
- 多個key/value可同行寫也可換行寫,同行使用,分隔
- key后面冒號要加一個空格 比如: key: value value可是個字符串,也可是另一個列表
- YAML文件擴展名通常為yml或yaml?
支持的數據類型? ?
YAML 支持以下常用幾種數據類型:
- 標量:單個的、不可再分的值
- 對象:鍵值對的集合,又稱為: 字典(dictionary)/ 哈希(hashes) / 映射(mapping)
- 數組:一組按次序排列的值,又稱為: 列表(list)/ 序列(sequence)?
寫法格式??
1 scalar 標量? 建議縮進兩個空格,可多
key對應value
name: wang
age: 18
使用縮進的方式
name:
?wang
age:
?18
2 Dictionary 字典
格式
格式
使用縮進方式
account:
????????name: wang
????????age: 18
????????gender: male?
范例:
#不同行
# An employee record
name: Example Developer
job: Developer
skill: Elite(社會精英)
#同一行,也可以將key:value放置于{}中進行表示,用,分隔多個key:value
# An employee record
{name: "Example Developer", job: "Developer", skill: "Elite"}?
3 List 列表
列表由多個元素組成, 本質就是數組
每個元素放在不同行,每個元素一行,且元素前均使用中橫線 - 開頭,并且中橫線 - 和元素之間有一個空
格
也可以將所有元素用 [ ] 括起來放在同一行,每個元素之間用逗號分隔?
格式
course: [ linux , golang , python ]?
也可以寫成以 - 開頭的多行
course:
????????- linux
????????- golang
????????- python?
元素里也可以包含字典
course:
??? ? - linux: manjaro
????????price: 10000
???? ?- golang: gin
????????class: 49
??? ? - python: django?
范例:
#不同行,行以-開頭,后面有一個空格
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
#同一行
[Apple,Orange,Strawberry,Mango]?
范例:YAML 表示一個家庭
name: John Smith
age: 41
gender: Male
spouse: { name: Jane Smith, age: 37, gender: Female } # 寫在一行里
?????
? ?name: Jane Smith #也可以寫成多行
????????age: 37
????????gender: Female
children: [ {name: Jimmy Smith,age: 17, gender: Male}, {name: Jenny Smith, age:
13, gender: Female}, {name: hao Smith, age: 20, gender: Male } ] #寫在一行
?? ? ?- name: Jimmy Smith #寫在多行,更為推薦的寫法
????????age: 17
????????gender: Male
??? ? - {name: Jenny Smith, age: 13, gender: Female}
??????- {name: hao Smith, age: 20, gender: Male }?
三種常見的數據格式
- XML:Extensible Markup Language,可擴展標記語言,可用于數據交換和配置
- JSON:JavaScript Object Notation, JavaScript 對象表記法,主要用來數據交換或配置,不支持注 釋
- YAML:YAML Ain't Markup Language YAML 不是一種標記語言, 主要用來配置,大小寫敏感, 不支持tab
可以用工具互相轉換,參考網站:?JSON在線解析及格式化驗證 - JSON.cn
定義的組在
#vim /etc/ansible/hosts [webservers] #最下面 在vim里 按G 跳到最下面 10.0.0.8 10.0.0.18 [dbservers] 10.0.0.18 10.0.0.[101:102]Playbook 核心組件? 不要用 tab 可以#注釋
一個playbook 中由多個組件組成,其中所用到的常見組件類型如下:
- Hosts 執行的遠程主機列表
- Tasks 任務集,由多個task的元素組成的列表實現,每個task是一個字典,一個完整的代碼塊功能需最 少元素需包括 name 和 task,一個name只能包括一個task
- Variables 內置變量或自定義變量在playbook中調用
- Templates 模板,可替換模板文件中的變量并實現一些簡單邏輯的文件
- Handlers 和 notify 結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
- tags 標簽 指定某條任務執行,用于選擇運行playbook中的部分代碼。ansible具有冪等性,因此 會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地 長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷?
常用 簡介
--syntax,--syntax-check #語法檢查,功能相當于bash -n -C --check #模擬執行dry run ,只檢測可能會發生的改變,但不真正執行操作 --list-hosts #列出運行任務的主機 --list-tags #列出tag --list-tasks #列出task --limit 主機列表 #只針對主機列表中的特定主機執行 ansible-playbook --limit 10.0.0.8 nginx.yaml -i INVENTORY, --inventory INVENTORY #指定主機清單文件,通常一個項對應一個主機清單文件 --start-at-task START_AT_TASK #從指定task開始執行,而非從頭開始,START_AT_TASK為任務的 name -v -vv -vvv #顯示過程vim hello.yaml?
--- 不強制寫 # 第一個Playbook 文件- hosts: webservers #針對的主機 可多個tasks: #針對的任務- name: test ping #這個任務做什么的 可漢字ping: #有參數可以寫 沒有就這樣- name: shell pwd #做什么shell: 'hostname -I' #命令及參數ansible-playbook -C hello.yaml? ? ?#模擬執行檢查
ansible-playbook --syntax-check hello.yaml? ? ? ? ? ? #語法檢查
[root@ubuntu2004 ~]#ansible-playbook -vv hello.yaml? ? ?#-v查看信息 最多4個 可以不加
hosts
組件 Hosts:playbook中的每一個play的目的都是為了讓特定主機以某個指定的用戶身份執行任務。hosts用 于指定要執行指定任務的主機,須事先定義在主機清單中
one.example.com one.example.com:two.example.com 192.168.1.50 192.168.1.* webservers:dbservers #或者,兩個組的并集 webservers:&dbservers #與,兩個組的交集 webservers:!dbservers #在webservers組,但不在dbservers組 案例 - hosts: webservers:appserversremote_user 組件? ?指定賬戶默認root
remote_user: 可用于Host和task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可 用于play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶?
- hosts: webserversremote_user: roottasks:- name: test connectionping:remote_user: wangesudo: yes #默認sudo為rootsudo_user:wang #將wange用戶sudo為wangnginx安裝?#默認會去files文件里找 把文件放里面不用加前面的
--- # nginx - hosts: 10.0.0.8remote_user: roottasks:- name: 安裝yum:name: nginxstate: present- name: 復制copy:src: /data/nginx.conf #默認會去files文件里找 把文件放里面不用加前面的 dest: /etc/nginx/nginx.conf 也是- name: 頁面copy:src: /data/index.htmldest: /usr/share/nginx/html/index.html- name: 啟動service:name: nginxstate:startedenabled: yesAnsible facts簡介? 修改收集加速
大家肯定疑問,這個facts是個啥?
facts組件是Ansible用于采集被管理機器設備信息的一個功能,采集的機器設備信息主要包含IP地址,操作系統,以太網設備,mac 地址,時間/日期相關數據,硬件信息等。
那話又說回來了,采集這些信息有什么用呢?有的時候我們需要根據遠程主機的信息作為執行條件操作,例如,根據遠程服務器使用的操作系統版本,可以安裝不同版本的軟件包;或者也可以顯示與每臺遠程計算機相關的一些信息,例如每臺設備上有多少RAM可用。
所以,在一些業務場景中,facts對我們是很有幫助的,省去了我們好多工作,大大提高了工作效率。
性能優化
每次執行playbook,默認會收集每個主機的所有facts變量,將會導致速度很慢,可以采用下面方法加速
方法1
關閉facts采集加速執行,此方法將導致無法使用facts變量
- hosts: all
gather_facts: no
?方法2
當使用 gather_facts: no 關閉 facts,確實能加速 Ansible 執行,但是有時候又需要使用 facts 中的內容,還希望執行的速度快,這時候可以設置facts 的緩存,將facts變量信息存在redis服務器中
[root@ansible ~]# cat /etc/ansible/ansible.cfg
[defaults]
# smart 表示默認收集 facts,但 facts 已有的情況下不會收集,即使用緩存 facts
# implicit 表示默認收集 facts,要禁止收集,必須使用 gather_facts: False
# explicit 則表示默認不收集,要顯式收集,必須使用gather_facts: True
gathering = smart ??????????????????????????? #在使用 facts 緩存時設置為smart
fact_caching_timeout = 86400???????? #緩存時長
fact_caching = redis???????? ????????????????#緩存存在redis中
fact_caching_connection = 10.0.0.100:6379:0 ????????#0表示redis的0號數據庫
#若redis設置了密碼
fact_caching_connection = 10.0.0.100:6379:0:password
ignore_errors? ?暫時忽略錯誤
在playbook執行的過程中,難免會遇到一些錯誤。由于playbook遇到錯誤后,不會執行之后的任務,不便于調試,此時,可以使用ignore_errors來暫時忽略錯誤,使得playbook繼續執行。
ignore_errors: yes #執行忽略上面錯誤 True 一樣register 輸出成變量 比如用debug模塊進行顯示輸出?
在playbook中可以使用register將捕獲命令的輸出保存在臨時變量中,方便后續調用此變量,比如可以使用debug模塊進行顯示輸出?
[root@centos8 ~]#cat register1.yml - hosts: dbserverstasks:- name: get variableshell: hostnameregister: name- name: "print variable"debug:msg: "{{ name }}" #輸出register注冊的name變量的全部信息,注意 變量要加" "引起來#msg: "{{ name.cmd }}" #顯示命令#msg: "{{ name.rc }}" #顯示命令成功與否#msg: "{{ name.stdout }}" #顯示命令的輸出結果為字符串形式,所有結果都放 在一行里顯示,適合于結果是單行輸出#msg: "{{ name.stdout_lines }}" #顯示命令的輸出結果為列表形式,逐行標準輸出,適 用于多行顯示#msg: "{{ name['stdout_lines'] }}" #顯示命令的執行結果為列表形式,和效果上面相同#msg: "{{ name.stdout_lines[0] }}" #顯示命令的輸出結果的列表中的第一個元素#說明 第一個 task 中,使用了 register 注冊變量名為 name ;當 shell 模塊執行完畢后,會將數據放到該 變量中。 第二給 task 中,使用了 debug 模塊,并從變量name中獲取數據。 [root@centos8 ~]#ansible-playbook register1.yml - hosts: webserverstasks:- name: get variableshell: hostnameregister: name- name: "print variable"debug:#msg: "{{ name }}"msg: "{{ name.stdout_lines }}"Playbook中使用handlers和notify??觸發器 指定觸發
Handlers本質是task list ,類似于MySQL中的觸發器觸發的行為,其中的task與前述的task并沒有本質 上的不同,只有在關注的資源發生變化時,才會采取一定的操作。
Notify對應的action 在所有task都執行完才會最后被觸發,這樣可避免多個task多次改變發生時每次都 觸發執行指定的操作,Handlers僅在所有的變化發生完成后一次性地執行指定操作。
在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作
- 如果多個task通知了相同的handlers, 此handlers僅會在所有task結束后運行一 次。
- 只有notify對應的task發生改變了才會通知handlers, 沒有改變則不會觸發handlers
- handlers 是在所有前面的tasks都成功執行才會執行,如果前面任何一個task失敗,會導致handler跳 過執行
列:?
# nginx - hosts: 10.0.0.8tasks:- name: 安裝yum:name: nginxstate: present- name: 復制copy:src: /data/nginx.confdest: /etc/nginx/nginx.confnotify: restart nginx # 注釋 上下一樣的名字 預示著這里改變就執行下面的命令 不變不執行 - name: 頁面copy:src: /data/index.htmldest: /usr/share/nginx/html/index.html- name: 啟動service:name: nginxstate:startedenabled: yeshandlers:- name: restart nginx # 注釋 上下一樣的名字 最好別漢語又可能出問題service: name=nginx state=restartedforce_handlers? ? ?不論前面的task成功與否 都執行
如果不論前面的task成功與否,都希望handlers能執行, 可以使用force_handlers: yes 強制執行handler 范例: 強制調用handlers\
- hosts: webserversforce_handlers: yes #無論task中的任何一個task失敗,仍強制調用handlerstasks:- name: config filecopy: src=nginx.conf dest=/etc/nginx/nginx.confnotify: restart nginx- name: install packageyum: name=no_exist_packagehandlers:- name: restart nginxservice: name=nginx state=restartedPlaybook中使用tags組件
- 默認情況下, Ansible 在執行一個 playbook 時,會執行 playbook 中所有的任務
- 在playbook文件中,可以利用tags組件,為特定 task 指定標簽,當在執行playbook時,可以只執行特 定tags的task,而非整個playbook文件
- 可以一個task對應多個tag,也可以多個task對應同一個tag
- 還有另外3個特殊關鍵字用于標簽, tagged, untagged 和 all,它們分別是僅運行已標記,只有未標記和所 有任務。
?
在主機清單中定義主機和主機組的變量
[webservers]
10.0.0.101 host=web01
10.0.0.102 host=web02
[webservers:vars]
domain=wang
[appservers]
10.0.0.[7:8]
10.0.0.101
[all:vars]
suffix=edu
?
?
?
?2
?將變量放在文件里,不放在變量也行
變量的優先級從高到低如下
-e 選項定義變量 -->playbook中vars_files --> playbook中vars變量定義 -->host_vars/主機名
文件 -->主機清單中主機變量--> group_vars/主機組名文件-->group_vars/all文件--> 主機清單組變量
?Template 模板
模板是一個文本文件,可以用于根據每個主機的不同環境而為生成不同的文件
模板文件中支持嵌套jinja2語言的指令,來實現變量,條件判斷,循環等功能
需要使用template模塊實現文件的復制到遠程主機,但和copy模塊不同,復制過去的文件每個主機可以會有所不同
jinja2語言
Jinja2 是一個現代的,設計者友好的,仿照 Django 模板的 Python 模板語言。 它速度快,被廣泛使用,并且提供了可選的沙箱模板執行環境保證安全:
特性:
- 沙箱中執行
- 強大的 HTML 自動轉義系統保護系統免受 XSS
- 模板繼承
- 及時編譯最優的 python 代碼
- 可選提前編譯模板的時間
- 易于調試。異常的行數直接指向模板中的對應行。
- 可配置的語法
template? ? 專門存放模板文件
template功能:可以根據和參考模塊文件,動態生成相類似的配置文件
template文件存建議放于templates目錄下,且命名為 .j2 結尾
yaml/yml 文件和templates目錄平級,此時playbook中指定模板文件時可不用指定路徑, 目錄結構如下?
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
template變更替換
#修改文件nginx.conf.j2
[root@ansible ~]#mkdir templates
[root@ansible ~]#vim templates/nginx.conf.j2
......
worker_processes {{ ansible_processor_vcpus }};? ? ? 本機的cpu個數,可以+*等
......
?template中使用流程控制 for 和 if
template中也可以使用流程控制 for 循環和 if 條件判斷,實現動態生成文件功能
for 循環
格式?
{% for i in EXPR %}
...
{% endfor %}
#示例:
{% for i in range(1,10) %}
server_name web{{i}};
{% endfor %}
?for.yam? ? ? ? ?#引用下面
?test.conf.j2
?
?
?#temlnginx2.yml
---
- hosts: webservers
remote_user: root
vars:
nginx_vhosts:
- 81
- 82
- 83
tasks:
- name: template config
template: src=nginx.conf2.j2 dest=/data/nginx.conf
#templates/nginx.conf2.j2
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost }}
}
{% endfor %}
ansible-playbook -C templnginx2.yml --limit 10.0.0.8
#生成的結果:
server {
listen 81
}
server {
listen 82
}
server {
listen 83
}
?循環,提取建網站
?
結果?
?
?if 條件判斷
有的有server_name有的沒有if判斷
?
?
?
?使用循環迭代
迭代:當有需要重復性執行的任務時,可以使用迭代機制
迭代 loop (with_items)
- 對迭代項的引用,固定內置變量名為"item"
- 要在task中使用with_items給定要迭代的元素列表
- 注意: ansible2.5版本后,可以用loop代替with_items
列表元素格式:
字符串
- 字典 key: value
?類似if循環
---
- hosts: webservers
remote_user: root
tasks:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
- testuser3
#上面語句的功能等同于下面的語句
- name: add several users
user: name=testuser1 state=present groups=wheel
- name: add several users
user: name=testuser2 state=present groups=wheel
- name: add several users
user: name=testuser3 state=present groups=wheel?
范例: 安裝多個軟件包?
#方法1 # cat install_packages.yml - hosts: webserverstasks:- name: Installed Httpd Php-fpm Packageyum: name={{ pack }} state=latestvars:pack:- httpd- php-fpm #方法2 # cat install_packages2.yml - hosts: webserverstasks:- name: Installed Httpd Php-fpm Packageyum:name: {{ item }}state: latestloop:- httpd- php-fpm # cat install_packages3.yml --- - hosts:webserversremote_user: roottasks- name: install some packagesyum: name={{ item }} state=presentwith_items:- nginx- memcached- php-fpmuntil 循環
#until為false時才會執行循環,為true則退出循環
[root@ansible ansible]#cat until.yml
- hosts: localhost
gather_facts: false
tasks:
- debug: msg="until"
until: false
retries: 3 #默認值即為3次
delay: 1
范例: 以輪詢的方式等待服務同步完成
- name: 以輪詢的方式等待服務同步完成
shell: "systemctl is-active mysqld.service"? ? ? ? #執行命令
register: mysqld_status? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #結果保存在在里面
until: '"active" in mysqld_status.stdout'? ? ? ? ? ? ? ? #檢查這里里面是否有,有退出
retries: 8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #試幾次
delay: 8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#停頓幾秒
with_lines 逐行處理?
逐行處理,一行打印一次
[root@ansible ansible]#cat with_lines.yml
- hosts: localhost
tasks:
- debug: msg={{ item }}
with_lines: ps aux
條件判斷 when
when語句可以實現條件測試。如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試,通過在task后添加when子句即可使用jinja2的語法格式條件測試?
范例: 判斷OS版本
[root@ansible ansible]#cat when.yml - hosts: alltasks:- name: install httpdyum:name: "httpd"when:- ansible_distribution_file_variety == "RedHat"- name: install packageapt:name: "apache2"when:- ansible_distribution_file_variety == "Debian"?范例: 數據類型轉換
- hosts: appserverstasks:- shell: echo "only on Red Hat 6, derivatives, and liter"when: ansible_distribution_file_variety == "RedHat" and ansible_facts['lsb']['major_release'] | int > 7分組 block
當想在滿足同樣條件下,執行多個任務時,就需要分組。而不再針對每個任務都是用
- hosts: appserverstasks:- block:- shell: echo "task1"- shell: echo "task2"when:- ansible_distribution_file_variety == "RedHat"- ansible_facts['lsb']['major_release'] | int > 7關閉 changed 狀態
當確定某個task不會對被控制端做修改時但執行結果卻顯示是黃色的changed狀態
可以通過 changed_when: false 關閉changed狀態
執行命令完他會顯示黃,這樣可以顯示綠
[root@ansible ansible]#cat test_changed.yml --- - hosts: webserverstasks:- name: check sshd serviceshell: ps aux| grep sshdchanged_when: false #關閉changed狀態利用 changed_when 檢查task返回結果
changed_when 檢查task返回結果,決定是否繼續向下執行
滾動執行
管理節點過多導致的超時問題解決方法
默認情況下,Ansible將嘗試并行管理playbook中所有的機器。對于滾動更新用例,可以使用serial關鍵字定義Ansible一次應管理多少主機,還可以將serial關鍵字指定為百分比,表示每次并行執行的主機數占總數的比例
范例:? 一次兩臺機器執行
#vim test_serial.yml --- - hosts: allserial: 2 #每次只同時處理2個主機,將所有task執行完成后,再選下2個主機再執行所有task,直至所 有主機gather_facts: Falsetasks:- name: task onecommand: hostname- name: task twocommand: hostnamename: test serail
hosts: all
serial: "20%" #每次只同時處理20%的主機,主機數不足時,向下取整?
?委派至其它主機執行
利用委托技術,可以在非當前被控主機的其它主機上執行指定操作
注意: 當前執行的被管理端主機需要實現到被委派主機的ssh key 驗證才能實現委派
范例: 將任務委派給指定的主機執行
[root@ansible ansible]#cat delegate.yml #在10.0.0.8上執行hostname -I,而非當前主機localhost - hosts: localhosttasks:- name: show ip addresscommand: hostname -Idelegate_to: 10.0.0.8 #指定當前任務被委派給的目標主機delegate_facts: true #收集被委派的目標主機的facts信息范例: 將任務被委派給控制端ansible主機執行
#在本地執行ifconfig,而非10.0.0.8 [root@ansible ansible]#cat delegate2.yml - hosts: 10.0.0.8tasks:- name: show ip addresslocal_action: command ifconfig #被委派給控制端ansible主機執行- name: show hostnameshell: hostnameconnection: local #被委派給控制端ansible主機執行- name: kernel versionshell: hostname -Idelegate_to: localhost #被委派給控制端ansible主機執行run_one: truce #委派任務只執行一次只執行一次
利用 run_once 指令可以只執行一次,而非在所有被控主機都執行
root@ansible ~]#cat run_once.yml
- hosts: webservers
tasks:
- command: hostname
run_once: true
[root@ansible ~]#ansible-playbook run_once.yml --list-hosts
playbook: run_once.yml
play #1 (webservers): webservers TAGS: []
pattern: ['webservers']
hosts (2):
10.0.0.8
10.0.0.7
[root@ansible ~]#ansible-playbook run_once.yml
環境變量?
臨時修改環境變量,只針對當前動作的task有效
[root@ansible ~]#cat environment.yml - hosts: localhosttasks:- shell: echo $PATHenvironment:PATH: /usr/local/app/bin:{{ ansible_env.PATH }} [root@ansible ~]#ansible-playbook environment.yml -vYaml 文件的相互調用
?include
利用include 或 include_tasks 可以在某個task中調用其它的只有task內容的yaml文件
import_playbook??由一個yml統一調用
還可以將多個包含完整內容的yml文件由一個yml統一調用
[root@ansible ansible]#cat main.yml - import_playbook: tasks1.yml - import_playbook: tasks2.yml[root@ansible ansible]#cat tasks1.yml --- - hosts: webserverstasks:- name: run task1 jobcommand: wall run task1 job [root@ansible ansible]#cat tasks2.yml --- - hosts: dbserverstasks:- name: run task2 jobcommand: wall run task2 job [root@ansible ansible]#ansible-play main.ymlRoles 角色
roles:多個角色的集合目錄, 可以將多個的role,分別放至roles目錄下的獨立子目錄中,如下示例
roles/
mysql/
nginx/
tomcat/
redis/
roles目錄結構:?
playbook1.yml
playbook2.yml
roles/
project1/
tasks/
files/
vars/
templates/
handlers/
defaults/
meta/
project2/
tasks/
files/
vars/
templates/
handlers/
defaults/
meta/
Roles各目錄作用
roles/project/ :項目名稱,有以下子目錄
默認找mian.yml
- files/ :存放由copy或script模塊等調用的文件
- templates/:template模塊查找所需要模板文件的目錄
- tasks/:定義task,role的基本元素,至少應該包含一個名為main.yml的文件;其它的文件需要在此
- 文件中通過include進行包含
- handlers/:至少應該包含一個名為main.yml的文件;此目錄下的其它的文件需要在此文件中通過include進行包含
- vars/:定義變量,至少應該包含一個名為main.yml的文件;此目錄下的其它的變量文件需要在此文件中通過include進行包含,也可以通過項目目錄中的group_vars/all定義變量,從而實現角色通用代碼和項目數據的分離
- meta/:定義當前角色的特殊設定及其依賴關系,至少應該包含一個名為main.yml的文件,其它文件需在此文件中通過include進行包含
- defaults/:設定默認變量時使用此目錄中的main.yml文件,比vars的優先級低?
總結
以上是生活随笔為你收集整理的Playbook的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和平精英美化包
- 下一篇: 解决连接湖南大学校园网Server is