playbook的核心元素:
web
tasks: 任務vim
variables: 變量ssh
templates: 模板測試
handlers: 處理器spa
roles: 角色
命令行
組織格式:YAML(被稱爲另一種標記語言)3d
語法:(列表用橫杆表示,鍵值對用冒號分割,鍵值對裏又能夠嵌套另外的鍵值對)blog
例如: name:tomrem
age:21it
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能夠定義在多處