ansible-playbook

ansbile playbook簡介

playbook是由一個或多個“play”組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。下面是一個簡單示例。

實例

- hosts: webnodes
vars:
http_port: 80
max_clients: 256
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
1.1 playbook基礎組件
1.1.1 Hosts和Users

playbook中的每一個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組;remote_user則用於指定遠程主機上的執行任務的用戶。如下面示例中的

-hosts: webnodes
remote_user: root

不過,remote_user也可用於各task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶`。

- hosts: webnodes
remote_user: test
tasks:
- name: test connection
ping:
remote_user:test
sudo: yes
1.1.2 任務列表和action

play的主體部分是task list。task
list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務後再開始第二個。在運行自下而下某playbook時,如果中途發生錯誤,所有已執行任務都將回滾,因此,在更正playbook後重新執行一次即可。
task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味着多次執行是安全的,因爲其結果均一致。
每個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘可能清晰地描述任務執行步驟。如果未提供name,則action的結果將用於輸出。
定義task的可以使用“action: module options”或“module:
options”的格式,推薦使用後者以實現向後兼容。如果action一行的內容過多,也中使用在行首使用幾個空白字符進行換行。

tasks:
- name: make sure apache is running
service: name=httpd state=running
`在衆多模塊中,只有command和shell模塊僅需要給定一個列表而無需使用“key=value”格式,例如:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
如果命令或腳本的退出碼不爲零,可以使用如下方式替代:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來忽略錯誤信息:
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True`
1.1.3 handlers

用於當關注的資源發生變化時採取一定的操作。
“notify”這個action可用於在每個play的最後被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之,僅在所有的變化發生完成後一次性地執行指定操作。在notify中列出的操作稱爲handler,也即notify中調用handler中定義的操作。

- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handler是task列表,這些task與前述的task並沒有本質上的不同。
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
案例:
heartbeat.yaml
- hosts: hbhosts
remote_user: root
tasks:
- name: ensure heartbeat latest version
yum: name=heartbeat state=present
- name: authkeys configure file
copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
- name: authkeys mode 600
file: path=/etc/ha.d/authkeys mode=600
notify:
- restart heartbeat
- name: ha.cf configure file
copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
notify: 
- restart heartbeat
handlers:
- name: restart heartbeat
service: name=heartbeat state=restarted
二、roles
ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模板及處理器放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。
一個roles的案例如下所示:
site.yml
webservers.yml
dbservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
meta/

而在playbook中,可以這樣使用roles:

- hosts: webservers
roles:
- common
- webservers

也可以向roles傳遞參數,例如:

- hosts: webservers
roles:
- common
- { role: foo_app_instance, dir: '/opt/a', port: 5000 }
- { role: foo_app_instance, dir: '/opt/b', port: 5001 }

甚至也可以條件式地使用roles,例如:

- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
2.1 創建role的步驟
(1) 創建以roles命名的目錄;
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等;
(3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建爲空目錄,也可以不創建;
(4) 在playbook文件中,調用各角色;
2.2 role內各目錄中可用的文件
tasks目錄:至少應該包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件可以使用include包含其它的位於此目錄中的task文件;
files目錄:存放由copy或script等模塊調用的文件;
templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件;
handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位於此目錄中;
vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量;
meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係;ansible 1.3及其以後的版本才支持;
default目錄:爲當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;

三、Tags

tags用於讓用戶選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼爲測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷。

實例:
第一個playbook,安裝httpd服務修改配置文件並啓動
- hosts: all
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: install configure file
copy: src=/working/files/httpd.conf dest=/etc/httpd/conf/
- name: start httpd service
service: name=httpd state=started

運行playbook

ansible-playbook web.yaml

第二個playbook,調用變量,設置client hostname

1.編輯/etc/ansible/hosts文件:
添加:
[webservers]
103.242.135.25 hname=wwww1

2.編輯hostname.yaml,內容如下:

- hosts: all
remote_user: root
tasks:
- name: set hostname
hostname: name={{ hname }}

第三個playbook,調用變量安裝程序包

- hosts: all 
remote_user: root
tasks:
- name: install {{ pservice }} service
yum: name={{ pservice }} state=present
- name: service {{ pservice }} start
service: name={{ pservice }} state=started
運行playbook
ansible-playbook variable.yaml -e pservice=memcached 
注意:調用時加-e 指定變量名對應的服務包名

playbook 注意:tags 打標籤 運行playbook時加-t參數,引用配置文件中定義好的tags標籤如下:

ansible-playbook -t installconf web.yaml

handlers作用:“notify”這個action可用於在每個play的最後被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之,僅在所有的變化發生完成後一次性地執行指定操作。在notify中列出的操作稱爲handler,也即notify中調用handler中定義的操作

- hosts: all
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: install configure file
copy: src=/working/files/httpd.conf dest=/etc/httpd/conf/
tags: installconf
notify: httpd restart
- name: start httpd service
service: name=httpd state=started
handlers:
- name: httpd restart
service: name=httpd state=restarted

這裏寫圖片描述

實例:

- hosts: area
  remote_user: root
  tasks:
  - name: gd-devel 
    yum: name=gd-devel state=present
  - name: pcre-devel
    yum: name=pcre-devel state=present
  - name: create otvcloud
    user: name=otvcloud system=true 
  - name: create cache directory
    file: path=/cache state=directory owner=otvcloud group=otvcloud
  - name: copy iptables file
    copy: src=/etc/sysconfig/iptables dest=/etc/sysconfig/iptables
  - name: copy file
    copy: src=nginx-1.8.0-cache1.1.0_t4.el6.x86_64.rpm dest=/root
  - name: install rpm
    yum: name="nginx-1.8.0-cache1.1.0_t4.el6.x86_64.rpm" state=present
  - name: start service 
    service: name=nginx state=started
  - name: start iptables
    service: name=iptables state=restarted

這裏寫圖片描述

驗證部署

這裏寫圖片描述

OK,playbook Learn this to the end
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章