Ansible Playbook 劇本語法

Ansible 系列:linux

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

  • 紅色: 表示有task執行失敗或者提醒的信息
  • 黃色:表示執行了且改變了遠程主機狀態
  • 綠色:表示執行成功

Playbook 劇本語法

一個 Playbook 主要有如下四部分構成:post

  • **target section:**定義將要執行 playbook 的遠程主機組;
  • **variable section:**定義 playbook 運行時須要使用的變量;
  • **task section:**定義將要在遠程主機上執行的任務列表;
  • **handler section:**定義task執行完成之後須要調用的任務;

Hosts(主機) 與 Users(用戶)

每個 Play 都要指定操做的目標主機,而且能夠指定用哪一個身份去完成執行的步驟(Tasks)。例如:this

- hosts: webservers
 remote_user: root
 tasks:
 - name: test connection
 remote_user: yourname
 sudo: yes
複製代碼
  • hosts:用於指定要執行指定任務的主機,能夠是一個或多個,由逗號分隔符分隔的主機組。
  • remote_user:用於指定遠程主機上執行任務的用戶,它也可用於各tasks中。
  • sudo:若是設置爲 yes 則獲取 root 權限去執行該任務,若是須要在使用 sudo 時指定密碼,可在運行 ansible-playbook 命令時加上選項 --ask-sudo-pass (-K)
  • connection:經過什麼方式鏈接到遠程主機(默認 ssh)。
  • gather_facts:默認會執行 setup 模塊,設置該選項設置爲 False 能夠關閉自動執行 setup 模塊。

vars (環境變量)

在執行 ansible-playbook 時經過添加選項 --extra-vars 看定義環境變量,能夠在 Playbook 中定義,還能夠在主機清單文件中配置。若是環境變量之間有衝突,則三者的優先級從高到低。

在 Playbook 中經過 {{ var_name }} 引用環境變量,如:

- hosts: all
 vars:  
 file_name: test

 tasks:
 - name:
 file: path=/tmp/{{ file_name }} state=touch
複製代碼

register (註冊變量)

經過 register 關鍵字能夠存儲指定命令的輸出結果到一個自定義的變量中。

- hosts: all
 tasks:
 - name:
 shell: netstat -lntp
 register: System_Status

 - name: Get System Status
 debug: msg={{System_Status.stdout_lines}}
複製代碼

tasks (任務)

每個 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
複製代碼

when (條件語句)

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 (循環語句)

除了條件語句以外,還能夠使用循環語句 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' }
複製代碼

ignore_errors (異常處理)

默認 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

複製代碼

tags (標籤)

經過對任務添加一個至多個標籤,能夠在執行 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 (觸發回調)

咱們還能夠經過 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 模塊)

include 用來動態的包含 Tasks 任務列表。

- hosts: all
 remote_user: root
 tasks:
 - include_tasks: p1.yml
 - include_tasks: p2.yml
複製代碼
相關文章
相關標籤/搜索