Ansible之Playbook详解、案例
playbook-劇本 介紹
playbooks是 一個不同于使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來說,playbook是一個非常簡單的配置管理和多主機部署系統,不同于任何已經存在的模式,可作為一個適合部署復雜應用程序的基礎。Playbook可以定制配置,可以按照指定的操作步驟有序執行,支持同步和異步方式。值得注意的是playbook是通過YAML格式來進行描述定義的。
?
- 核心元素
Tasks:任務,由模板定義的操作列表
Variables:變量
Templates:模板,即使用模板語法的文件
Handlers:處理器 ,當某條件滿足時,觸發執行的操作
Roles:角色
- hosts和users介紹
-
在playbook中的每一個play都可以選擇在哪些服務器和以什么用戶完成,hosts一行可以是一個主機組、主機、多個主機,中間以冒號分隔,可使用通配模式。其中remote_user表示執行的用戶賬號。
--- - hosts: abc #指定主機組,可以是一個或多個組。remote_user: root #指定遠程主機執行的用戶名 -
指定遠程主機sudo切換用
# vim ping.yml --- - hosts: abcremote_user: root become: yes #2.6版本以后的參數,之前是sudo,意思為切換用戶運行become_user: mysql #指定sudo用戶為mysql執行playbook # ansible-playbook ping.yml -K - Tasks list 和action介紹
1:Play的主體部分是task列表,task列表中的各任務按次序逐個在hosts中指定的主機上執行,即在所有主機上完成第一個任務后再開始第二個任務。
在運行playbook時(從上到下執行),如果一個host執行task失敗,整個tasks都會回滾,請修正playbook 中的錯誤,然后重新執行即可。
Task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量,模塊執行時冪等的,這意味著多次執行是安全的,因為其結果一致。
2:每一個task必須有一個名稱name,這樣在運行playbook時,從其輸出的任務執行信息中可以很好的辨別出是屬于哪一個task的。如果沒有定義name,‘action’的值將會用作輸出信息中標記特定的task。
3:定義一個task,常見的格式:”module: options” 例如:yum: name=httpd
4:ansible的自帶模塊中,command模塊和shell模塊無需使用key=value格式
- 常用命令
- ansible-playbook [yaml文件名、也可以yml結尾]
- 例如:ansible-playbook a.yml
-
參數:
-k(–ask-pass) 用來交互輸入ssh密碼
# ansible-playbook a.yml --syntax-check #檢查yaml文件的語法是否正確# ansible-playbook a.yml --list-task #檢查tasks任務# ansible-playbook a.yml --list-hosts #檢查生效的主機# ansible-playbook a.yml --start-at-task='Copy Nginx.conf' #指定從某個task開始運行
-K(-ask-become-pass) 用來交互輸入sudo密碼
-u 指定用戶 -
示例
# vim a.yml --- - hosts: 192.168.200.129 //指定主機remote_user: root //指定在被管理的主機上執行任務的用戶tasks: //任務列表↓- name: disable selinux //任務名關閉防火墻command: '/sbin/setenforce 0' //調用command模塊 執行關閉防火墻命令- name: start httpd //任務名 開啟httpdservice: name=httpd state=started //調用service模塊 開啟httpd 服務 # ansible-playbook a.yml --syntax-check #檢查yaml文件的語法是否正確 # ansible-playbook a.yml
?
- play中只要執行命令的返回值不為0,就會報錯,tasks停止,可以添加下面
- ignore_errors: True #忽略錯誤,強制返回成功
?
?
- Handlers介紹
- andlers也是一些task的列表,和一般的task并沒有什么區別。
- 是由通知者進行的notify,如果沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
- 不管有多少個通知者進行了notify,等到play中的所有task執行完成之后,handlers也只會被執行一次
? - 示例
?
- 引用變量
- 使用:vars: 添加變量
?
- 直接引用Ansible變量
- ansible_all_ipv4_addresses 獲取IP
?
- 引用主機變量
-
在組的主機后面添加變量
# vim /etc/ansible/hosts # vim c.yml # ansible-playbook c.yml //執行這個劇本
- 查看這個生成的文件
?
?
條件判斷
- when的值是一個條件表達式,如果條件判斷成立,這個task就執行,如果判斷不成立,則task不執行
- 如果需要根據變量、facts(setup)或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。
- 在task后添加when子句即可使用條件測試:when子句支持jinjia2表達式或語法,例如:
- 多條件判斷
?
- 組條件判斷
?
- 自定義條件判斷
?
?
- 迭代
- 有需要重復性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變量引用,并通過with_items語句指明迭代的元素列表即可。
- 示例:
?
?
- Templates介紹
-
Jinja是基于Python的模板引擎。template類是Jinja的另一個重要組件,可以看作一個編譯過的模塊文件,用來生產目標文本,傳遞Python的變量給模板去替換模板中的標記。
# scp root@192.168.175.130:/etc/httpd/conf/httpd.conf ./templates //復制被管理端的配置文件到本地 # vim templates/httpd.conf //在管理端講配置文件要修改的地方定義變量 Listen {{http_port}} ServerName {{server_name}} MaxClients {{access_num}} -
在/etc/ansible/hosts 添加變量
# vim /etc/ansible/hosts [abc] 192.168.200.129 http_port=192.168.200.129:80 access_num=100 server_name="www.yun.com:80" # vim apache.yml # ansible-playbook apache.yml #然后執行腳本 然后去abc組的主機上查看下配置文件是否已經改了
?
?
- Tags介紹
- 在一個playbook中,我們一般會定義很多個task,如果我們只想執行其中的某一個task或多個task時就可以使用tags標簽功能了
-
事實上,不光可以為單個或多個task指定同一個tags。playbook還提供了一個特殊的tags為always。作用就是當使用always當tags的task時,無論執行哪一個tags時,定義有always的tags都會執行。
執行下面命令
# ansible-playbook hosts.yml --tags="only" //去被管理主機上查看文件創建情況 2個tags都會執行
總結
以上是生活随笔為你收集整理的Ansible之Playbook详解、案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx+upsync+consul
- 下一篇: saltstack与ansible对比