一、ansible簡介
Ansible
創始人,Michael DeHaan( Cobbler 與 Func 的作者)
2012-03-09,發布0.0.1版,紅帽收購
2015-10-17,Red Hat宣布收購
1.1 ansible特性
ansible的特性:
- 模塊化:調用特定的模塊,完成特定任務
- 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
- 支持自定義模塊
- 基於Python語言實現
- 部署簡單,基於python和SSH(默認已安裝),agentless
- 安全,基於OpenSSH
- 支持playbook編排任務
- 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況
- 無需代理不依賴PKI(無需ssl)
- 可使用任何編程語言寫模塊
-YAML格式,編排任務,支持豐富的數據結構 - 較強大的多層解決方案
1.2 ansible架構
1.3 ansible工作原理
1.4 ansible主要組成部分
ansible主要組成部分:
- 1 ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
- 2 INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
- 3 MODULES:Ansible執行命令的功能模塊,多數為內置的核心模塊,也可自定義
- 4 PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
- 5 API:供第三方程序調用的應用程序編程接口
- 6 ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執行工具
Ansible命令執行來源:
- USER,普通用戶,即SYSTEM ADMINISTRATOR
- CMDB(資產管理系統) API 調用
- PUBLIC/PRIVATE CLOUD API調用
- USER-> Ansible Playbook -> Ansibile
利用ansible實現管理的方式:
- Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
- Ansible-playbook 主要用於長期規划好的,大型項目的場景,需要有前提的規划
1.4.1 Ansible-playbook(劇本)
-
Ansible-playbook(劇本)執行過程:
將已有編排好的任務集寫入Ansible-Playbook
通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行 -
Ansible主要操作對象:
HOSTS主機
NETWORKING網絡設備 -
注意事項
執行ansible的主機一般稱為主控端,中控,master或堡壘機
主控端Python版本需要2.6或以上
被控端Python版本小於2.4需要安裝python-simplejson
被控端如開啟SELinux需要安裝libselinux-python
windows不能做為主控端
二、ansible配置
2.1 安裝ansible
(1)rpm包安裝: EPEL源
yum install ansible
(2)編譯安裝:
yum -y install python-jinja2 PyYAML python-paramiko
python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
2.2 ansible配置文件
(1)配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄
(2)程序
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官
(3)網平台
/usr/bin/ansible-playbook 定制自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具
2.3 主機清單inventory
(1)Inventory 主機清單
- ansible的主要功用在於批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名
- 默認的inventory file為/etc/ansible/hosts
- inventory file可以有多個,且也可以通過Dynamic
- Inventory來動態生成
(2)/etc/ansible/hosts文件格式
inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸並到多個不同的組中;此外,當如若=目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機
- 示例:
[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com
2.4 ansible配置文件
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)
[defaults]
inventory = /etc/ansible/hosts //主機列表配置文件
library = /usr/share/my_modules/ //庫文件存放目錄
remote_tmp = $HOME/.ansible/tmp //臨時py命令文件存放在遠程主機目錄
local_tmp = $HOME/.ansible/tmp //本機的臨時命令執行目錄
forks = 5 //默認並發數
sudo_user = root // 默認sudo 用戶
ask_sudo_pass = True //每次執行ansible命令是否詢問ssh密碼
ask_pass = True
remote_port = 22
host_key_checking = False //檢查對應服務器的host_key,建議取消注釋
三、ansible系列命令
Ansible系列命令
ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull
3.1 ansible-doc
ansible-doc: 顯示模塊幫助
ansible-doc [options] [module...]
-a 顯示所有模塊的文檔
-l, --list 列出可用模塊
-s, --snippet 顯示指定模塊的playbook片段
示例:
ansible-doc –l 列出所有模塊
ansible-doc ping 查看指定模塊幫助用法
ansible-doc –s ping 查看指定模塊幫助用法
3.2 ansible
[-m module_name] [-a args]
ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯系各被管理節點
ansible
--version 顯示版本
-m module 指定模塊,默認為command
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫—list
-k, --ask-pass 提示連接密碼,默認Key驗證
-K, --ask-become-pass 提示輸入sudo
-C, --check 檢查,並不執行
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
-b, --become 代替舊版的sudo 切換
3.3 ansible的Host-pattern
匹配主機的列表
All :表示所有Inventory中的所有主機
ansible all –m ping
- :通配符
ansible “” -m ping
ansible 192.168.1. -m ping
ansible “srvs” -m ping
或關系
ansible “websrvs:appsrvs” -m ping
ansible “192.168.1.10:192.168.1.20” -m ping
邏輯與
ansible “websrvs:&dbsrvs” –m ping
在websrvs組並且在dbsrvs組中的主機
邏輯非
ansible ‘websrvs:!dbsrvs’ –m ping
在websrvs組,但不在dbsrvs組中的主機
綜合邏輯
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正則表達式
ansible “websrvs:&dbsrvs” –m ping
ansible “~(web|db)..magedu.com” –m ping
3.4 ansible-galaxy
連接 https://galaxy.ansible.com 下載相應的roles
列出所有已安裝的galaxy
ansible-galaxy list
安裝galaxy
ansible-galaxy install geerlingguy.redis
刪除galaxy
ansible-galaxy remove geerlingguy.redis
3.5 ansible-pull
推送命令至遠程,效率無限提升,對運維要求較高
Ansible-playbook
ansible-playbook hello.yml
3.6 Ansible-vault
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 編輯加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 創建新文件
3.7 ansibleI命令執行過程
1)ansible命令執行過程
- 加載自己的配置文件 默認/etc/ansible/ansible.cfg
- 加載自己對應的模塊文件,如command
- 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
- 給文件+x執行
- 執行並返回結果
- 刪除臨時py文件,sleep 0退出
- 執行狀態:
綠色:執行成功並且不需要做改變的操作
黃色:執行成功並且對目標主機做變更
紅色:執行失敗
2)示例
以wang用戶執行ping存活檢測
ansible all -m ping -u wang -k
以wang sudo至root執行ping存活檢測
ansible all -m ping -u wang –b -k
以wang sudo至mage用戶執行ping存活檢測
ansible all -m ping -u wang –b -k --become-user mage
以wang sudo至root用戶執行ls
ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K
3.8 ansible常有模塊
1) Command:在遠程主機執行命令,默認模塊,可忽略-m選項
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功
此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現
2) Shell:和command相似,用shell執行命令
ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &> /tmp/example.txt 這些復雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器
3) Script:運行腳本
-a "/PATH/TO/SCRIPT_FILE“
snsible websrvs -m script -a f1.sh
4) Copy:從服務器復制文件到客戶端,
ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
如目標存在,默認覆蓋,此處指定先備份
ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成目標文件
5) Cron:計划任務
支持時間:minute,hour,day,month,weekday
ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 創建任務
ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務
6) Fetch:從客戶端取文件至服務器端,copy相反,目錄可先tar
ansible srv -m fetch -a ‘src=/root/a.sh
dest=/data/scripts’
7) File:設置文件屬性
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
Hostname:管理主機名
ansible node1 -m hostname -a “name=websrv”
8) Yum:管理包
ansible srv -m yum -a ‘name=httpd state=latest’ 安裝
ansible srv -m yum -a ‘name=httpd state=absent’ 刪除
9)Service:管理服務
ansible srv -m service -a 'name=httpd state=stopped'
ansible srv -m service -a 'name=httpd state=started'
ansible srv –m service –a ‘name=httpd state=reloaded’
ansible srv -m service -a 'name=httpd state=restarted'
10) User:管理用戶
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘ 刪除用戶及家目錄等數據
11) Group:管理組
ansible srv -m group -a "name=testgroup system=yes“
ansible srv -m group -a "name=testgroup state=absent"
3.9 Ansible-console:2.0+新增,可交互執行命令,支持tab
root@test (2)[f:10] $
執行用戶@當前操作的主機組 (當前組的主機數量)[f:並發數]$
設置並發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd web
列出當前組主機列表: list
列出所有的內置命令: ?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
四、playbook
playbook是由一個或多個“play”組成的列表
play的主要功能在於將事先歸並為一組的主機裝扮成事先通過
ansible中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個
playbook中,即可以讓它們聯同起來按事先編排的機制同唱一台大戲
Playbook采用YAML語言編寫
4.1 playbook原理
4.2 YAML介紹
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者
YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)
- 特性
YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實現語言的數據類型
YAML有一個一致的信息模型
YAML易於實現
YAML可以基於流來處理
YAML表達能力強,擴展性好
更多的內容及規范參見http://www.yaml.org
4.3 YAML語法介紹
List:列表,其所有元素均使用“-”打頭
- 示例:
// A list of tasty fruits - Apple
- Orange
- Strawberry
- Mango
(1)簡介
在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
使用#號注釋代碼
縮進必須是統一的,不能空格和tab混用
縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感
k/v的值可同行寫也可換行寫。同行使用:分隔
v可是個字符串,也可是另一個列表
一個完整的代碼塊功能需最少元素需包括 name: task
一個name只能包括一個task
YAML文件擴展名通常為yml或yam
(2)示例
Dictionary:字典,通常由多個key與value構成
- 示例:
// An employee record
name: Example Developer
job: Developer
skill: Elite
也可以將key:value放置於{}中進行表示,用,分隔多個key:value
- 示例
// An employee record
{name: Example Developer, job: Developer, skill: Elite}
4.4 playbook核心元素
Hosts 執行的遠程主機列表
Tasks 任務集
Varniables 內置變量或自定義變量在playbook中調用
Templates 模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
Handlers 和notity結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
tags 標簽 指定某條任務執行,用於選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
ansible-playbook –t tagsname useradd.yml
4.4.1 playbook基礎組件
(1)Hosts:
playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的用戶身份執行任務。hosts用於指定要執行指定任務的主機,須事先定義在主機清單中
可以是如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs 兩個組的並集
Websrvs:&dbsrvs 兩個組的交集
webservers:!phoenix 在websrvs組,但不在dbsrvs組
示例: - hosts: websrvs:dbsrvs
(2)remote_user: 可用於Host和task中。也可以通過指定其通
過sudo的方式在遠程主機上執行任務,其可用於play全局或某
任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切
換的用戶
- hosts: websrvs
remote_user: root
tasks: - name: test connection
ping:
remote_user: magedu
sudo: yes 默認sudo為root
sudo_user:wang sudo為wang
(3)task列表和action
play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務后再開始第二個。在運行自下而下某playbook時,如果中途發生錯誤,所有已執行任務都將回滾,因此,在更正playbook后重新執行一次即可
- task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味着多次執行是安全的,因為其結果均一致
每個task都應該有其name,用於playbook的執行結果輸出,建議其內容盡可能清晰地描述任務執行步驟。如果未提供name,則action的結果將用於輸出
tasks:任務列表
格式:(1) action: module arguments
(2) module: arguments 建議使用
注意:shell和command模塊后面跟命令,而非key=value
某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers
任務可以通過"tags“打標簽,而后可在ansible-playbook命令上使用-t指定進行調用
示例:
tasks:
-
name: disable selinux command: /sbin/setenforce 0
-
如果命令或腳本的退出碼不為零,可以使用如下方式替代
tasks: -
name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true
-
或者使用ignore_errors來忽略錯誤信息:
tasks:- name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True
4.4.2 Handlers,notify
Handlers
是task列表,這些task與前述的task並沒有本質上的不同,用於當關注的資源發生變化時,才會采取一定的操作
notify
notify這個action可用於在每個play的最后被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,僅在所有的變化發生完成后一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作
示例1:
示例2:
4.4.3 tags使用
4.5 運行playbook
運行playbook的方式
ansible-playbook <filename.yml> ... [options]
常見選項
--check 只檢測可能會發生的改變,但不真正執行操作
--list-hosts 列出運行任務的主機
--limit 主機列表 只針對主機列表中的主機執行
-v 顯示過程 -vv -vvv 更詳細
示例:
ansible-playbook file.yml --check 只檢測
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs
示例:
4.6 playbook中變量
4.6.1 變量名
變量名:僅能由字母、數字和下划線組成,且只能以字母開頭
變量來源:
1 ansible setup facts 遠程主機的所有變量都可直接調用
2 在/etc/ansible/hosts中定義
普通變量:主機組中主機單獨定義,優先級高於公共變量
公共(組)變量:針對主機組中所有主機定義統一變量
3 通過命令行指定變量,優先級最高
ansible-playbook –e varname=value
4 在playbook中定義
vars:
- var1: value1
- var2: value2
5 在role中定義
4.6.2 變量命名
變量名僅能由字母、數字和下划線組成,且只能以字母開頭
變量定義:key=value
示例:http_port=80
變量調用方式:
通過{{ variable_name }} 調用變量,且變量名前后必須有空格,有時用“{{ variable_name }}”才生效
ansible-playbook –e 選項指定
ansible-playbook test.yml -e "hosts=www user=mageedu"
示例:變量
示例:var.yml
- hosts: websrvs
remote_user: root
tasks:- name: install package
yum: name={{ pkname }} state=present
ansible-playbook –e pkname=httpd var.yml
- name: install package
示例:變量
示例:var2.yml
-
hosts: websrvs
remote_user: root
vars:- username: user1
- groupname: group1
tasks:
- name: create group
group: name={{ groupname }} state=present - name: create user
user: name={{ username }} state=present
ansible-playbook var2.yml
ansible-playbook -e "username=user2 groupname=group2” var2.yml
4.6.3 主機變量,組變量
可以在inventory中定義主機時為其添加主機變量以便於在playbook中使用
示例:
[websrvs]
www1.magedu.com http_port=80 maxRequestsPerChild=808
www2.magedu.com http_port=8080 maxRequestsPerChild=909
組變量
組變量是指賦予給指定組內所有主機上的在playbook中可用的變量
示例:
[websrvs]
www1.magedu.com
www2.magedu.com
[websrvs:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
示例:
普通變量
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2
公共(組)變量
[websvrs:vars]
http_port=808
mark=“_”
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2
ansible websvrs –m hostname –a ‘name={{ hname }}{{ mark }}{{http_port }}’
命令行指定變量:
ansible websvrs –e http_port=8000 –m hostname –a ‘name={{hname }}{{ mark }}{{ http_port }}’
4.6.4 模板templates
(1)模板介紹
文本文件,嵌套有腳本(使用模板編程語言編寫)
Jinja2語言,使用字面量,有下面形式
字符串:使用單引號或雙引號
數字:整數,浮點數
列表:[item1, item2, ...]
元組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運算:and, or, not
流表達式:For If When
templates功能:根據模塊文件動態生成對應的配置文件
templates文件必須存放於templates目錄下,且命名為 .j2 結尾
yaml/yml 文件需和templates目錄平級,目錄結構如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
(2)Templates示例
示例:利用templates 同步nginx配置文件
(3)Playbook中template變更替換
(4)Playbook中template算術運算
算法運算:
示例:
vim nginx.conf.j2
worker_processes {{ ansible_processor_vcpus*2 }};
worker_processes {{ ansible_processor_vcpus+2 }};
(5)when語句測試
- 條件測試:如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試,通過when語句實現,在task中使用,jinja2的語法格式
when語句
在task后添加when子句即可使用條件測試;when語句支持Jinja2表達式語法
示例:
tasks: - name: "shutdown RedHat flavored systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "RedHat"
示例1:
示例2:
4.6.5 迭代:with_items
迭代:當有需要重復性執行的任務時,可以使用迭代機制
對迭代項的引用,固定變量名為”item“
要在task中使用with_items給定要迭代的元素列表
列表格式:
字符串
字典
示例:
示例:
示例:
示例:
示例:
五、roles
ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模板及處理器放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中
- 復雜場景:建議使用roles,代碼復用度高
變更指定主機或主機組
如命名不規范維護和傳承成本大
某些功能需多個Playbook,通過Includes即可實現
5.1ansible roles目錄編排
5.2 roles目錄結構
每個角色,以特定的層級目錄結構進行組織
roles目錄結構:
playbook.yml
roles/
project/
tasks/
files/
vars/ 不常用
default/ 不常用
templates/
handlers/
meta/ 不常用
5.2.1 roles各目錄作用
roles/project/ :項目名稱,有以下子目錄
files/ :存放由copy或script模塊等調用的文件
templates/:template模塊查找所需要模板文件的目錄
tasks/:定義task,role的基本元素,至少應該包含一個名為
main.yml的文件;其它的文件需要在此文件中通過include進行包含
handlers/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含
vars/:定義變量,至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含
meta/:定義當前角色的特殊設定及其依賴關系,至少應該包含一個名為main.yml的文件,其它文件需在此文件中通過include進行包含
default/:設定默認變量時使用此目錄中的main.yml文件
5.3 創建role
創建role的步驟
(1) 創建以roles命名的目錄
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等
(3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建
(4) 在playbook文件中,調用各角色
5.3.1使用示例
5.4 playbook調用角色
(1)調用角色方法1:
- hosts: websrvs
remote_user: root
roles: - mysql
- memcached
- nginx
(2)調用角色方法2:
傳遞變量給角色
- hosts:
remote_user:
roles: - mysql
- { role: nginx, username: nginx }
鍵role用於指定角色名稱
后續的k/v用於傳遞變量給角色
(3)調用角色方法3:還可基於條件測試實現角色調用
roles:
- { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }
5.5 roles playbook tags使用
roles playbook tags使用