Ansible之playbook(剧本)介绍和配置详解
前言
在上篇博文中講解了ansible的多個常用的模塊,這些模塊讓ansible具有了管理,部署后端主機的能力,但是一個一個命令的執行明顯很浪費時間,那么能不能有一個文件類似于shell腳本那樣可以把復雜的、重復的命令,簡單化、程序流程化起來呢?答案是肯定的,playbook劇本就是類似于shell腳本的一個文件,不過他有自己的語法格式。
一、playbook簡介
playbook就是ansible用于配置,部署和管理被控節點的一個任務列表文件,通過執行playbook中的一系列task,可以讓被控主機達到預期的狀態,更強大的地方在于,在 playbooks 中可以編排有序的執行過程,甚至于做到在多組機器間,來回有序的執行特別指定的步驟,并且可以同步或異步的發起任務。
playbook 由一個或多個 ‘plays’ 組成.它的內容是一個以 ‘plays’ 為元素的列表.在 play 之中,一組機器被映射為定義好的角色.在 ansible 中,play 的內容,被稱為 tasks,即任務.在基本層次的應用中,一個任務是一個對 ansible 模塊的調用。
playbook由YMAL語言編寫,類似于JSON的文件格式,便于理解和閱讀,同時書寫也比較方便。
編寫playbook需要用到的組件:Iventory file、 Moudles、actions(command)
一個完整的playbook的構成:tasks 任務、variables 變量、templates 模版、handlers 處理器、roles角色。
二、playbook配置
首先我把官網給提供的playbook拿過來結合它介紹一下語法格式。(這個playbook中只有一個play)
# 文件第一行以 --- 開頭表示YMAL文件開始(文件中 # 之后內容表示注釋,和shell一樣) --- # hosts 行的內容是一個或多個組或主機的 patterns,以逗號為分隔符, - hosts: webservers # vars用來定義變量vars:http_port: 80max_clients: 200 # remote_user 就是用戶名remote_user: root # task 下面是任務列表tasks: # 使用yum模塊進行操作- name: ensure apache is at the latest versionyum: pkg=httpd state=latest- name: write the apache config filetemplate: src=/srv/httpd.j2 dest=/etc/httpd.conf # 定義一個觸發器notify:- restart apache- name: ensure apache is runningservice: name=httpd state=started # 和上面定義的觸發器對應,當觸發器被觸發時執行下面的操作handlers:- name: restart apacheservice: name=httpd state=restarted 注意: 1.YMAL中的列表元素以”-”開頭然后緊跟著一個空格,后面為元素內容。 2.同一個列表中的元素應該保持相同的縮進。否則會被當做錯誤處理。 3.play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"后面還要增加一個空格。關于用戶
如果你需要在使用 sudo 時指定密碼,可在運行 ansible-playbook 命令時加上選項 --ask-sudo-pass (-K). 如果使用 sudo 時,playbook 疑似被掛起,可能是在 sudo prompt 處被卡住,這時可執行 Control-C 殺死卡住的任務,再重新運行一次.
tasks列表
每一個 play 包含了一個 task 列表(任務列表).一個 task 在其所對應的所有主機上執行完畢之后,下一個 task 才會執行。每個 task 的目標在于執行一個 moudle, 通常是帶有特定的參數來執行.在參數中可以使用變量(variables)
每一個 task 必須有一個名稱 name,這樣在運行 playbook 時,從其輸出的任務執行信息中可以很好的辨別出是屬于哪一個 task 的. 如果沒有定義 name,‘action’ 的值將會用作輸出信息中標記特定的 task.
下面是一種基本的 task 的定義,service moudle 使用 key=value 格式的參數,這也是大多數 module 使用的參數格式:
tasks:- name: make sure apache is runningservice: name=httpd state=running比較特別的兩個 modudle 是 command 和 shell ,它們不使用 key=value 格式的參數,而是這樣:
tasks:- name: disable selinuxcommand: /sbin/setenforce 0使用 command module 和 shell module 時,需要關心返回碼信息,如果有一條命令,它的成功執行的返回碼不是0, 可以樣做:
tasks:- name: run this command and ignore the resultshell: /usr/bin/somecommand || /bin/true # 或者這樣也可以 tasks:- name: run this command and ignore the resultshell: /usr/bin/somecommandignore_errors: True如果 action 行看起來太長,你可以使用 space(空格) 或者 indent(縮進) 隔開連續的一行:
tasks:- name: Copy ansible inventory file to clientcopy: src=/etc/ansible/hosts dest=/etc/ansible/hostsowner=root group=root mode=0644在 action 行中可以使用變量.假設在 ‘vars’ 那里定義了一個變量 ‘vhost’ ,可以這樣使用它:
tasks:- name: create a virtual host file for {{ vhost }}template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}Handlers: 在發生改變時執行的操作
遠端系統被人改動時,可以重放 playbooks 達到恢復的目的. playbooks 本身可以識別這種改動,并且有一個基本的 event system(事件系統),可以響應這種改動.
(當發生改動時)’notify’ actions 會在 playbook 的每一個 task 結束時被觸發,而且即使有多個不同的 task 通知改動的發生, ‘notify’ actions 只會被觸發一次.
舉例來說,比如多個 resources 指出因為一個配置文件被改動,所以 apache 需要重新啟動,但是重新啟動的操作只會被執行一次.
這里有一個例子,當一個文件的內容被改動時,重啟兩個 services:
- name: template configuration filetemplate: src=template.j2 dest=/etc/foo.confnotify:- restart memcached- restart apacheHandlers 也是一些 task 的列表,通過名字來引用,它們和一般的 task 并沒有什么區別.Handlers 是由通知者進行 notify, 如果沒有被 notify,handlers 不會執行.不管有多少個通知者進行了 notify,等到 play 中的所有 task 執行完成之后,handlers 也只會被執行一次.
這里是一個 handlers 的示例:
handlers:- name: restart memcachedservice: name=memcached state=restarted- name: restart apacheservice: name=apache state=restartedHandlers 最佳的應用場景是用來重啟服務,或者觸發系統重啟操作.除此以外很少用到了.
執行一個playbook
[root@ser1 ~]# ansible-playbook playbook.yml -f 10 # -f 10表示并行的級別 是10在執行一個 playbook 之前,想看看這個 playbook 的執行會影響到哪些 hosts,你可以這樣做:
[root@ser1 ~]# ansible-playbook playbook.yml --list-hosts------做運維之前很矯情的小年輕-----
總結
以上是生活随笔為你收集整理的Ansible之playbook(剧本)介绍和配置详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ansible基本使用及常用模块详解
- 下一篇: 基于Nginx的负载均衡