上一篇博客介紹了ansible的基礎應用Modules,博客地址 http://www.www58058.com/14860 。這次介紹下Ansible的另一個核心模塊Playbooks。
Ansible的核心模塊:
Ansible core: 核心;
core Modules: 包括 Ansible 自帶的核心模塊及自定義模塊;
connect Plugins: 完成模塊功能的補充,包括連接插件、郵件插件等;
Playbooks: 網上很多翻譯為劇本,個人覺得理解為編排更為合理;定義 Ansible 多任務配置文件,由 Ansible 自動執行;
host Inventory: 定義 Ansible 管理主機的清單、主機池、主機列表;
Playbook是由一個或多個“play”組成的列表。play的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansible中的task定義好的角色。
從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。
ansinbl使用 Python paramiko 開發,分布式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2模板語言,更強的遠程命令執行操作。
YAML介紹:
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者。
YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。其特性:
YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實現語言的數據類型
YAML有一個一致的信息模型
YAML易于實現
YAML可以基于流來處理
YAML表達能力強,擴展性好
更多的內容及規范參見http://www.yaml.org。
1、YAML語法:
YAML的語法和其他高階語言類似,并且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)里的項用"-"來代表,Map里的鍵值對用":"分隔。
Playbook組成結構:
Inventory
Modules
Ad Hoc Commands
Playbooks
Tasks:任務,即調用模塊完成的操作
Variables:變量
Templates:模板
Handlers:處理器,由某個條件觸發執行的操作
Roles:角色
基本結構:
– host:webservices
remote_user:
– tasks:
– task1
module_name
YAML文件擴展名通常為.yml,如test.yml。
2、使用yaml模板文件安裝httpd、提供其配置文件、配置開機啟動并啟動服務:
[root@master ansible]# vim apache.yml
– hosts: webserver
remote_user: root
tasks:
– name: install httpd package
yum: name=httpd state=latest
– name: install configuration file for httpd
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
– name: start httpd service
service: enabled=true name=httpd state=started
3、YAML語言變量:
變量命名:變量名僅能由字母、數字和下劃線組成,且只能以字母開頭。
facts變量:
facts是由正在通信的遠程目標主機發回的信息,這些信息被保存在ansible變量中。要獲取指定的遠程主機所支持的所有facts,可使用如下命令進行:
ansible hostname -m setup
register
把任務的輸出定義為變量,然后用于其他任務,示例如下:
tasks:
– shell: /usr/bin/foo
register: foo_result
ignore_errors: True
通過命令行傳遞變量:
在運行playbook的時候也可以傳遞一些變量供playbook使用,示例如下:
ansible-playbook test.yml –extra-vars "hosts=webserver user=node1"
通過roles傳遞變量:
當給一個主機應用角色的時候可以傳遞變量,然后在角色內使用這些變量,示例如下:
– hosts: webservers
roles:
– common
– { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }
Inventory:
ansible的主要功用在于批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名。默認的inventory file為/etc/ansible/hosts。
inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成。
inventory文件格式:
inventory文件遵循INI文件風格,中括號中的字符為組名??梢詫⑼粋€主機同時歸并到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明。
test.ansible.com
[webservers]
www1.mageedu.com:2222
www2.mageedu.com
[dbservers]
db1.mageedu.com
db2.mageedu.com
db3.mageedu.com
如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機,例如:
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
主機變量:可以在inventory中定義主機時為其添加主機變量以便于在playbook中使用。例如:
[webservers]
www1.mageedu.com http_port=80 maxRequestsPerChild=808
www2.mageeducom http_port=8080 maxRequestsPerChild=909
組變量:組變量是指賦予給指定組內所有主機上的在playboo中可用的變量。例如:
[webservers]
www1.mageedu.com
www2.mageedu.com
[webservers:vars]
ntp_server=ntp.mageedu.com
nfs_server=nfs.mageedu.com
4、使用變量、模板文件安裝配置apache:
5、條件測試:
如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試。
when語句
在task后添加when子句即可使用條件測試;when語句支持Jinja2表達式語法。例如:
tasks:
– name: "shutdown Debian flavored systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "Debian"
when語句中還可以使用Jinja2的大多“filter”,例如要忽略此前某語句的錯誤并基于其結果(failed或者sucess)運行后面指定的語句,可使用類似如下形式:
tasks:
– command: /bin/false
register: result
ignore_errors: True
– command: /bin/something
when: result|failed
– command: /bin/something_else
when: result|success
– command: /bin/still/something_else
when: result|skipped
此外,when語句中還可以使用facts或playbook中定義的變量。
6、迭代:
當有需要重復性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變量引用,并通過with_items語句來指明迭代的元素列表即可。例如:
調用:item
定義循環列表:whit_item
– apache
– php
– mysql-server
注意:whit_items中的列表值也可以是字典,但引用是要使用item_KEY
– {name: apache,conf: confffiles/httpd.conf}
– {name: php,conf:conffiles/php.ini}
– {name: mysql-servce,conf/conffiles/my.cnf}
– name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
– testuser1
– testuser2
上面語句的功能等同于下面的語句:
– name: add user testuser1
user: name=testuser1 state=present groups=wheel
– name: add user testuser2
user: name=testuser2 state=present groups=wheel
事實上,with_items中可以使用元素還可為hashes,例如:
– name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
– { name: 'testuser1', groups: 'wheel' }
– { name: 'testuser2', groups: 'root' }
ansible的循環機制還有更多的高級功能,具體請參見官方文檔(http://docs.ansible.com/playbooks_loops.html)。
7、tags:
tags用于讓用戶選擇運行或路過playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷。
在playbook可以為某個或默寫任務定義一個“標簽”,在執行此playbook時,通過為ansible-playbook命令,使用–tags選項能實現僅運行指定的tasks而非所有:
[root@master ansible]# vim targ.yml
– hosts: webserver
remote_user: root
vars:
– package: httpd
– service: httpd
tasks:
– name: install httpd package
yum: name={{ package }} state=latest
– name: install configuration file for httpd
template: src=/etc/ansible/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags:
– conf
notify:
– restart httpd
– name: start httpd service
service: enabled=true name={{ service }} state=started
handlers:
– name: restart httpd
service: name=httpd state=restarted
~
ansible-playbook targ.yml –tags="conf"
特殊tags:always 無論無可都運行
8、roles:
ansilbe自1.2版本引入的新特性,用于層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變量文件、tasks以及handlers等。
要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模塊及處理器放置于單獨的目錄中,
并可以便捷地include它們的一種機制。角色一般用于基于主機構建服務的場景中,但也可以是用于構建守護進程等場景中。
創建role的步驟:
(1) 創建以roles命名的目錄;
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等;
(3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建;
(4) 在playbook文件中,調用各角色;
8.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文件;
9、使用roles角色分離task、files、handlers文件
a、創建roles目錄:
mkdir -pv /etc/ansible/ansible_playbooks/roles/websrvs{tasks,files,templates,meta,handlers,vars}
b、提供配置文件:(也可以使用模板文件)
cp /etc/httpd/conf/httpd.conf /etc/ansible/ansible_playbooks/roles/websrvs/files
c、編輯task任務文件格式為main.yml
d、編輯handlers通知文件格式為main.yml
e、編輯站點site.yml文件調用roles角色的websrvs
f、基于roles角色運行site.yml
g、測試客戶端:
感謝馬哥,每天進步一點點!
原創文章,作者:n18-jude,如若轉載,請注明出處:http://www.www58058.com/14869
寫的很詳細,學習