playbook的核心元素:
tasks: 任務
variables: 變量
templates: 模板
handlers: 處理器
roles: 角色
組織格式:YAML(被稱為另外一種標記語言)
語法:(列表用橫桿表示,鍵值對用冒號分割,鍵值對里又可以嵌套另外的鍵值對)
例如: name:tom
age:21
gender:Male
spourse:
name:lily
gender:female
children:
— name:susan
age: 2
gender:female
— name:sunny
age: 10
gender:male
列表:用—引導
字典:包含多個k:v鍵值對 例如 {name:tom age:21 gender:male} 上面的表示就是一個字典,字典也可以嵌套,如上面的
spourse下又嵌套了一個字典,而children下包含了兩個列表,每個列表下又嵌套了一個字典
創建一個playbook文件:vim /root/first.yml (這類文件必須以.yml或.yaml結尾)
一般的格式為:
- hosts:
vars:
remote_user:
tasks:
handlers:
hosts 定義單個主機或組,vars定義變量,remote_user定義執行命令的遠程用戶,tasks定義執行哪些命令,handlers定義調用哪些
處理器
下圖是一個簡單示例:
如何運行我定義的劇本呢? 使用ansible-playbook命令 例如:ansible-playbook /root/first.yml
變量:
變量命名:字母數字下划線組成,只能以字母開頭
變量種類: facts(內置變量)
自定義變量:(1)通過命令行傳遞,(2)通過roles傳遞,(3)主機變量,(4)組變量
facts:由遠程主機發回的主機屬性信息,這些信息被保存在ansible變量當中
例如:ansible 192.168.238.170 -m setup 來獲取遠程主機上的屬性信息,這些屬性信息保存在facts中
通過命令行傳遞:ansible-playbook test.yml --extra-vars “host=www user=tom“(如果劇本中已有此處定義的變量則會被
覆蓋)
主機變量:在/etc/ansible/hosts中定義,如下圖
name=tom就是給主機192.168.238.168單獨定義的變量(主機變量)
組變量:[group_name:vars]
var1=value
var2=value
inventory參數:ansible基於ssh連接inventory(/etc/ansible/hosts)中指定的遠程主機時,將以此處指定的屬性進行連接
ansible_ssh_port 連接遠程主機使用的端口
ansible_ssh_user 連接遠程主機使用的用戶
ansible_ssh_pass 連接遠程主機使用的密碼(建議使用基於密鑰認證,而不是用此選項)
使用示例:vim /etc/ansible/hosts
第二個劇本:vim /root/second.yml
在playbook中調用變量的方式為{{ variable }}
條件測試:在某task后面添加when子句即可實現條件測試功能,例如:
ansible_os_family 是facts中內置的屬性信息 ansible_os_family的信息可以使用ansible all -m setup | grep
ansible_os_family 查看
迭代:
在task中調用內置的item變量;在某task后面使用with_items語句來定義元素列表
例如:
- name: add four users
user: name={{ item }} state=present
with_items:
- testuser1
- testuser2
- testuser3
- testuser4
迭代中,列表中的每個元素可以為字典格式
例如:
- name: add two users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testuser5', groups: 'wheel' }
- { name: 'testuser6', groups: 'root' }
handlers:也是task,但只有其關注的條件滿足時,才會被觸發執行 例如:
vim /root/fourth.yml
上面的意思是copy中復制過去的文件跟遠程主機上的文件不同,就通過notify調用handlers,即重啟httpd服務
handler 重啟服務是最通用的用法
templates:用於生成文本文件(配置文件);模板文件中可使用jinja2表達式,表達式要定義在{{ }},也可以簡單地僅執行變量替
換;
使用示例: vim /etc/ansible/hosts
添加了http_port的變量
接下來:vim /root/httpd.conf
Listen的端口使用 {{ http_port }},這樣是為了調用此變量
接下來: vim /root/fourth.yml
修改copy為template
ansible-playbook /root/fourth.yml,這時192.168.238.168就會監聽為8080端口, 而不是默認的80端口了
roles:roles用於實現“代碼復用”,roles以特定的層次型格式組織起來的playbook元素(variables, tasks, templates,
handlers);可被playbook以role的名字直接進行調用
roles的文件結構:
files/:此角色中用到的所有文件均放置於此目錄中;
templates/:Jinja2模板文件存放位置
tasks/:任務列表文件;可以有多個,但至少有一個叫做main.yml的文件
handlers/:處理器列表文件;可以有多個,但至少有一個叫做main.yml的文件
vars/:變量字典文件;可以有多個,但至少有一個叫做main.yml的文件
meta/:此角色的特殊設定及依賴關系
例如:mkdir /etc/ansible/roles cd /etc/ansible/roles mkdir web1/{files,templates,tasks,handlers,vars,meta}
(1)vim web1/vars/main.yml
(2) vim web1/tasks/main.yml
這里的template指的是相對路徑-->web1/templates
(3) vim web1/handlers/main.yml
cp /root/httpd.conf /etc/ansible/roles/web1/templates/
vim /etc/ansible/roles/web1/templates/httpd.conf
將User和Group都替換為上面定義的變量
在roles之外定義一個調用roles的文件,vim /etc/ansible/web1.yml 這個文件的文件名必須以.yml結尾
hosts:web1 指在/etc/ansible/hosts中定義的組,上面有定義
最后的 - web1 指的是/etc/ansible/roles/web1 目錄
這時只需更改上面的hosts指定的值就可對不同的主機實現代碼重用了
還可以通過role傳遞變量,例如
還可以調用多個role,例如
每次運行palybook都會把里面的內容都運行一遍,而有時只想運行一些內容,這時可以使用tags
vim /etc/ansible/roles/web1/tasks/main.yml
使用命令ansible-playbook -t conf web1.yml 就只執行定義了conf的tags的那個標簽的任務,此處就是install config file
tags可以定義在多處