Ansible 系列:linux
- (一):快速上手 Ansible
- (二):Ansible 命令
- (三):Ansible 主機清單配置文件
- (四):Ansible Playbook 劇本語法
Playbook(劇本)是系統 Ansible 指令的集合,其利用 YAML 語言編寫,自上而下按順序一次執行。它能夠實現一些 Ad-Hoc 指令沒法實現的操做,例如從一臺機器的文件中抓取內容並賦爲另外一臺機器的變量等操做。web
下面是一個 Playbook 劇本例子:shell
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd.j2 dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
複製代碼
第一行中 ---
是 YAML 將文件解釋爲正確文檔的格式要求,YAML 它容許多個文檔存在與同一個文件中,每一個文檔由 ---
符號分割。一般一個 Playbook 對應一個文檔,所以你也能夠省略它。apache
YAML 具備強制性的格式規範,對空格很是敏感,經過空格來將不一樣信息分組在一塊兒,而不能使用製表符,而且必須使用一致的間距才能正確讀取文件。ubuntu
以 -
開頭的項目被視爲列表項目,具備 key:value 格式的項。centos
YAML 文件的擴展名一般爲 .yaml 或 .yml。ssh
Playbook 的執行結果有三種顏色:memcached
一個 Playbook 主要有如下四部分構成:post
每個 Play 都要指定操做的目標主機,而且能夠指定用哪一個身份去完成執行的步驟(Tasks)。例如:this
- hosts: webservers
remote_user: root
tasks:
- name: test connection
remote_user: yourname
sudo: yes
複製代碼
ansible-playbook
命令時加上選項 --ask-sudo-pass (-K)
。在執行 ansible-playbook
時經過添加選項 --extra-vars
看定義環境變量,能夠在 Playbook 中定義,還能夠在主機清單文件中配置。若是環境變量之間有衝突,則三者的優先級從高到低。
在 Playbook 中經過 {{ var_name }}
引用環境變量,如:
- hosts: all
vars:
file_name: test
tasks:
- name:
file: path=/tmp/{{ file_name }} state=touch
複製代碼
經過 register
關鍵字能夠存儲指定命令的輸出結果到一個自定義的變量中。
- hosts: all
tasks:
- name:
shell: netstat -lntp
register: System_Status
- name: Get System Status
debug: msg={{System_Status.stdout_lines}}
複製代碼
每個 Play 包含了一個 tasks
任務列表,任務列表中的任務會按次序逐個在指定的主機上執行,而且完成第一個後再開始第二個任務。
tasks 經過模塊來完成實際操做,其格式爲 "module:options"
,除了 Command 和 Shell 模塊以外,一般大多數模塊使用 key=value 格式的參數。
tasks:
- name: make sure apache is running
service: name=httpd state=running
tasks:
- name: disable selinux
command: /sbin/setenforce 0
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True
複製代碼
Playbook 中的條件判斷語句使用 when
,一般這能夠結合 Setup 模塊針對不一樣系統主機執行不一樣的操做。
- hosts: all
remote_user: root
tasks:
- name: Create File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")
#系統爲centos的主機纔會執行
- name: Centos Install httpd
yum: name=httpd state=present
when: (ansible_distribution == "CentOS")
#系統爲ubuntu的主機纔會執行
- name: Ubuntu Install httpd
yum: name=httpd2 state=present
when: (ansible_distribution == "Ubuntu")
複製代碼
除了條件語句以外,還能夠使用循環語句 with_items
,例以下面場景中經過循環語句批量安裝軟件:
- hosts: all
remote_user: root
tasks:
- name: Installed Pkg
yum: name={{ item }} state=present
with_items:
- wget
- tree
- lrzsz
複製代碼
或者批量建立用戶:
- hosts: all
remote_user: root
tasks:
- name: Add Users
user: name={{ item.name }} groups={{ item.groups }} state=present
with_items:
- { name: 'testuser1', groups: 'bin' }
- { name: 'testuser2', groups: 'root' }
複製代碼
默認 Playbook 會檢查命令和模塊的返回狀態,如遇到錯誤就中斷執行。經過加入參數 ignore_errors: yes
來忽略錯誤。
- hosts: all
remote_user: root
tasks:
- name: Ignore False
command: /bin/false
ignore_errors: yes
- name: touch new file
file: path=/tmp/bgx_ignore state=touch
複製代碼
經過對任務添加一個至多個標籤,能夠在執行 ansible-playbook
指令時使用 -t
或 --skip-tags
選項來控制執行指定標籤任務,或跳過指定標籤的任務。
- hosts: all
remote_user: root
tasks:
- name: Install Nfs Server
yum: name=nfs-utils state=present
tags:
- install_nfs
- install_nfs-server
- name: Service Nfs Server
service: name=nfs-server state=started enabled=yes
tags: start_nfs-server
複製代碼
使用 -t
指定 tags
執行, 多個 tags
使用逗號隔開便可:
ansible-playbook -t install_nfs-server playbook.yml
複製代碼
咱們還能夠經過 handlers
在某個任務執行完成後觸發某些操做,例如當一個文件內容被改動時,重啓兩個 services,以下面 Playbook:
- hosts: all
remote_user: root
tasks:
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
複製代碼
notify
下列出的便是 Handlers,Handlers 其實也是一些 tasks 的列表。
Handlers 是由通知者進行 notify
,若是沒有被 notify
,Handlers 不會執行。
include
用來動態的包含 Tasks 任務列表。
- hosts: all
remote_user: root
tasks:
- include_tasks: p1.yml
- include_tasks: p2.yml
複製代碼