Ansible-Playbook詳解
阿新 • • 發佈:2021-01-18
目錄
一、Playbook 簡介
playbook是由一個或多個"play"組成的列表
play的主要功能在於將預定義的一組主機,裝扮成事先通過ansible中的task定義好的角色。
Task實際是呼叫ansible的一個module,將多個play組織在一個playbook中,即可以讓它們聯合起來,按事先編排的機制執行預定義的動作
Playbook採用YAML語言編寫
二、Playbook 圖解
使用者通過ansible命令直接呼叫yml語言寫好的playbook,playbook由多條play組成
每條play都有一個任務(task)相對應的操作,然後呼叫模組modules,應用在主機清單上,通過ssh遠端連線
從而控制遠端主機或者網路裝置
三、YAML 介紹
YAML是一個可讀性高的用來表達資料序列的格式。它具備以下特性
- YAML的可讀性好
- YAML和指令碼語言的互動性好
- YAML使用實現語言的資料型別
- YAML有一個一致的資訊模型
- YAML易於實現
- YAML可以基於流來處理
- YAML表達能力強,擴充套件性好
四、Playbook 核心元素
Hosts 執行的遠端主機列表(應用在哪些主機上) Tasks 任務集 Variables 內建變數或自定義變數在playbook中呼叫 Templates模板 可替換模板檔案中的變數並實現一些簡單邏輯的檔案 Handlers和notify結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行 tags標籤 指定某條任務執行,用於選擇執行playbook中的部分程式碼。 ansible具有冪等性,因此會自動跳過沒有變化的部分, 即便如此,有些程式碼為測試其確實沒有發生變化的時間依然會非常地長。 此時,如果確信其沒有變化,就可以通過tags跳過此些程式碼片斷 ansible-playbook -t tagsname useradd.yml
五、Playbook 書寫
5.1 使用變數方法
- 通過ansible命令傳遞
ansible-playboook test.yaml -e "key=value"
- yaml直接定義變數
vars:
key1=value1
key2=value2
- 在hosts裡檔案定義
5.2 條件測試
如果需要根據變數、facts (setup)或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。在task後新增when子句即可使用條件測試: when子句支援jinjia2表示式或語法。
- hosts: mysql
remote_user: root
tasks:
- name: "shut down Centos 7 systems"
command: /sbin/shutdown -r now
when:
- ansible_distribution == "Centos”
- ansible_distribution_major_version =="7"
5.3 迭代
當有需要重複性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變數引用,並通過with items語句指明迭代的元素
- hosts: webserver
remote_user: root
tasks:
- name: "Add users"
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name:'test1', groups:'wheel'}
{ name:'test2', groups:'root'}
5.4 Templates 模組
vi templates/httpd.conf //放在管理端
Listen {{http_port}}
ServerName {{server_name}}
MaxClients {{access_num}}
vi /etc/ansible/hosts
[webserver]
192.168.175.130 http_port=10.0.0.101:80 access num=100 server_name="www.cloud.com:80"
- hosts: webserver
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest
- name: install configure file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd server
service: name={{service}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
5.5 tags 模組
在一個playbook中,我們一般會定義很多個task,如果我們只想執行其中的某一個task或多個task時就可以使用tags標籤功能了
- hosts: webserver
remote_user: root
tasks:
- name: copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- only
- name: touch file
file: path=/opt/hosts01 state=touch
執行命令:ansible-plavbook hosts.vml --tags="only"
事實上,不光可以為單個或多個task指定同一個tags。playbook還提供了一個特殊的tags為always。作用就是當使用always當tags的task時,永遠執行該要求
六、roles
6.1 簡介
roles能夠根瓶層次型結構自動裝載變數檔案、task以及handlers等。簡單來講,roles就是通過分別將變數、檔案、任務、模組及處知器故置於單獨的目錄中,並可以便速地include它們,roles一直用於基於主機構建
6.2 roles 目錄
- files:用來存放由copy模組或script模組呼叫的檔案。
- templates:用來存放jinjia2模板,template模組會自動在此目錄中尋找jinjia2模板檔案。
- tasks:此目錄應當包含一個main.yml檔案,用於定義此角色的任務列表,此檔案可以使用include包含其它的位於此目錄的task檔案。
- handlers:此目錄應當包含一個main.yml檔案,用於定義此角色中觸發條件時執行的動作。
- vars:此目錄應當包含一個main.yml檔案,用於定義此角色用到的變數。
- defaults:此目錄應當包含一個main.yml檔案,用於為當前角色設定預設變數。
- meta:此目錄應當包含一個main.yml檔案,用於定義此角色的特殊設定及其依賴關係。