Ansible-playbook使用方法
1 roles目錄結構及其作用
1.1每個角色以特定的層次目錄結構進行組織,具體的結構層次如下所示
roles/project/??? # 項目名稱,有以下子目錄
??? tasks/?# 定義task,role的基本元素,至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含
??? files/# 存放由copy或script模塊等調用的文件
??? vars/?# 定義變量,至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含
??? templates/?# template模塊查找所需要模板文件的目錄
??? handlers/??# 至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含
?? default/ # 設定默認變量時使用此目錄中的main.yml文件
?? meta/??# 定義當前角色的特殊設定及其依賴關系,至少應該包含一個名為main.yml的文件,其它文件需在此文件中通過include進行包含
1.2 創建role的步驟
(1) 創建以roles命名的目錄(本篇文檔以yum安裝的ansible講解,通過各種方式安裝的使用方法是一致的,roles目錄不需要創建,在/etc/ansible目錄下)
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webserver等
(3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建
(4) 在playbook文件中,調用各角色
1.3 playbook常用的指令
ansible-playbook?****.yml? 執行某一個yml文件
ansible-playbook? ****.yml--syntax-check? 檢查語法
ansible-playbook? ****.yml--list-task檢測任務
ansible-playbook? ****.yml–list-hosts檢查生效主機
ansible-playbook? ****.yml–start-at-task=***指定開始的task位置
1.4 ansible執行流程
2 編寫簡單具體的playbook例子
2.1例子1(添加用戶):
以添加用戶為例:
然后執行yml文件
執行腳本,site.yml文件可以在任何目錄下,因為在執行ansible命令時候會去調用roles下相應的文件。
ansible-playbook site.yml
2.2例子2(循環添加用戶with_items):
進行循環添加用戶
通過使用item進行迭代,with_items包含的是需要進行迭代的數據。
2.3 例子3(變量安裝服務):
2.4 例子4(修改inventory配置文件)
將本來的hosts文件移動到/root目錄下
執行ansible-playbook site.yml可以看到執行成功
2.5 例子5 (修改inventory文件):
執行ansible-playbook site.yml可以看到執行成功
2.6 例子6 (使用include):
安裝httpd目錄
[root@centos ansible]#mkdir roles/httpd/{files,tasks} -pv
mkdir: created directory ‘roles/httpd’
mkdir: created directory ‘roles/httpd/files’
mkdir: created directory ‘roles/httpd/tasks’
創建任務文件,編輯任務
[root@centos ansible]#touch
roles/httpd/tasks/{install.yml,conf.yml,service.yml,main.yml,copy.yml}
1 創建安裝服務
[root@centos httpd]#cat tasks/install.yml
- name: install httpd
? yum: name=httpd
2 復制本地配置文件到遠端
[root@centos httpd]#cat tasks/conf.yml
- name: config
? copy: src=httpd.confdest=/etc/httpd/conf/httpd.conf
3 復制html文件
[root@centos httpd]#cat tasks/copy.yml
- name: HTML
? copy: src=index.html dest=/var/www/html
4 開啟服務
[root@centos httpd]#cat tasks/service.yml
- name: service httpd
? service: name=httpd state=started enabled=yes
5 依次導入不同的任務執行
主yml文件,對yml文件進行順序執行
[root@centos httpd]#cat tasks/main.yml
- include: install.yml
- include: conf.yml
- include: copy.yml
- include: service.yml
執行主site.yml文件
ansible-playbook?site.yml
2.7 例子7(判斷when):
ansible_distribution_major_version為進行判斷的依據,當獲取的版本信息與進行判斷的值相匹配則執行相應的任務
2.8 例子8(錯誤跳過ignore_errors):
ansible默認機制是當playbook中某個task任務執行失敗,后面的task便不會執行,如果想跳過錯誤繼續執行,需要添加ignore_errors
遠端服務器沒有test.sh腳本,所以當添加ignore_errors后,在執行該任務時會跳過這一步,繼續執行下面的任務。
2.9 例子9(register):
本例以查看遠端服務器時間為例,register:取得shell模塊的返回結果并賦值給result,然后將返回的結果通過debug模塊進行打印顯示。
Debug是ansible版本的print語句,可以輸出變量的內容或者隨意的字符串,利于playbook執行階段的調試
msg:輸出定義好的message,如果沒有message,默認輸出hello world
var:輸出變量的內容不可與msg選項共用
2.10 例子10(使用不同roles的task):
跨角色調用別的roles中task時候,要注意路徑,最好使用絕對路徑。
2.11 例子11(調用多個roles,并且可以給role加標簽只運行其中一部分),這里我驗證沒有通過
此前我在test1以及test2中已經設置了相應的tags,但是在執行命令時候沒有執行相應的tags,后面再查找問題所在。
備注:
ansible變量優先級(由高到低)
ansible-playbook命令中的變量,ansible-playbook-e var=value
task變量
block變量
role中定義的變量和include變量
set_fact
registered變量
vars_files
var_prompt
play變量
host facts
playbook中設置的host_vars
playbook中設置的group_vars
inventory中設置的host_vars
inventory中設置的group_vars
inventory變量
role中defaults/main.yml中定義的變量