Ansible playbook及 示例
Playbook 是由一個或多個 play組成的列表,主要功能是將task定義好的角色歸並為一組進行統一管理,也就是通過task調用Ansible的模板將多個play組織在一個Playbook中運行
Playbooks本身由以下各部分組成
(1) Tasks:任務,即調用模塊完成的某操作
(2) Variables:變量
(3) Templates:模板
(4) Handlers:處理器,當某條件滿足時,觸發執行的操作
(5) Roles:角色
Hosts和Uses介紹
Playbook的設計目的是為了讓某個或某些主機以某個用戶的身份去執行相應的任
務。其中用於指定要執行指定任務的主機用 hosts定義,可以是一個主機也可以是由冒
- hosts: webserver ##指定主機組,可以是一個或多個組。
remote_user: root ##指定遠程主機執行的用戶名
任務列表 和 action介紹
Play的主體是任務列表。任務列表中的任務按照次序逐個在hosts中指定的所有主機上執行,在順序執行這些任務時,如果發生錯誤會將所有已執行任務
回滾,因此,需要在更正 Playbook中的錯誤後重新執行這些任務
task的任務是按照指定的參數去執行模塊。每個task都使用name輸出 Playbook
運行結果。
定義task的格式可以用 action: module options或 module: options,其中後者可以實
現向後兼容。如果 action的內容過多,可在行首使用空白字符進行換行。
示例
- hosts: abc remote_user: root tasks: - name: disable selinux command: ‘/sbin/setenforce 0‘ ##關閉selinux - name: make sure apache is running service: name=httpd state=started ##開啟httpd服務 ##play中只要執行命令的返回值不為0,就會報錯,tasks停止 加上下面這句話 可以強制執行 ignore_errors: True ##忽略錯誤,強制返回成功
Handlers 介紹
Handlers用於當關註的資源發生變化時所采取的操作。在 notify中列出的操作便
稱為 handler,也就是在notify中需要調用 handler中定義的操作。而 notify這個動作在
每個play的最後被觸發,僅在所有的變化發生完成後一次性地執行指定操作。
示例
- hosts: abc
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest ##按照最新版本的httpd服務
- name: install configuration file for httpd
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf ##配置文件
notify:
-restart httpd ##調用名字為 restart httpd 的handler
- name: start httpd service
service: enabled=true name=httpd state=started ## 開啟httpd服務
handlers:
- name: restart httpd
service: name=httpd state=restarted
Templates介紹
Jinja是基於 Python的模板引擎。 Template類是 Jinja的另一個重要組件,可以看
作是一個編譯過的模板文件,用來產生目標文本,傳遞 Python的變量給模板去替換模
板中的標記。
示例
從被管理端復制一份httpd.conf到管理端
並做如下修改
vi templates/httpd.conf
Listen {{http_port}}
ServerName {{server_name}}
MaxClients {{access_num}}
vi /etc/ansible/hosts
[aaa]
192.168.x.x http_port=192.168.x.x:80 access_num=100 server_name="www.aaa.com:80"
## 在hosts文件為主機配置變量
vi httpd.yml
- hosts: aaa
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest ##安裝最新版本的httpd
- name: install configure file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf ##使用模板並根據變量進行配置
notify:
- restart httpd ##調用handler
- name: start httpd server
service: name={{service}} enabled=true state=started ##開啟服務
handlers:
- name: restart httpd
service: name={{service}} state=restarted
Tags 介紹
如果多次執行修改 Playbook 會涉及到一些沒有變化的代碼,可以使用tags讓 用戶選擇跳過沒有變化的代碼。只運行Playbook中發生變化的部分代碼。可以在Playbook中為某個或某些任務定義“標簽”,在執行此Playbook時通過 ansible-playbook命令 使用 --tags 選項能實現僅運行指定的tasks。
示例
vi hosts.yml
- hosts: aaa
remote_user: root
tasks:
- name: Copy hosts file
copy: src=/etc/hosts dest=/etc/hosts
tags:
- only
- name: touch file
file: path=/opt/hosts state=touch
執行命令:ansible-playbook hosts.yml --tags="only"
會只執行標簽為 only的任務
事實上,不光可以為單個或多個task指定同一個tags。playbook還提供了一個特殊的tags為always。作用就是當使用always當tags的task時,無論執行哪一個tags時,定義有always的tags都會執行。
如果在上面的yaml文件中添加
- name: touch file
file: path=/opt/hosts state=touch
tags:
- always
執行命令:ansible-playbook hosts.yml --tags="only"
會將兩個task都執行
Roles 介紹
Ansible為了層次化、結構化地組織 Playbook,使用了角色( roles),可以根據層
次結構自動裝載變量文件、 tasks以及 handlers等。只需要在 Playbook中使用 include
指令即可使用 roles。簡單來講, roles就是通過分別將變量、文件、任務、模塊及處理
器設置於單獨的目錄中,便捷地使用他們。
示例
本示例為:安裝搭建LAMP架構
roles內各目錄含義解釋
files:用來存放由copy模塊或script模塊調用的文件。
templates:用來存放jinjia2模板,template模塊會自動在此目錄中尋找jinjia2模板文件。
tasks:此目錄應當包含一個main.yml文件,用於定義此角色的任務列表,此文件可以使用include包含其它的位於此目錄的task文件。
handlers:此目錄應當包含一個main.yml文件,用於定義此角色中觸發條件時執行的動作。
vars:此目錄應當包含一個main.yml文件,用於定義此角色用到的變量。
defaults:此目錄應當包含一個main.yml文件,用於為當前角色設定默認變量。
meta:此目錄應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關系。
在每個角色命令的目錄中分別創建files、handlers、tasks、templates、meta、defaults和vars目錄,用不到的目錄可以創建為空目錄,但不可以不創建。
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
在每個角色的handlers、tasks、meta、defaults、vars目錄下創建main.yml文件,千萬不能自定義。
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
------編寫httpd模塊------
vi /etc/ansible/roles/httpd/tasks/main.yml
- name: ensure apache is at the latest version
yum: pkg={{ pkg }} state=latest
定義變量:可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中
vi /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd
-------編寫mysql模塊-------
vi /etc/ansible/roles/mysql/tasks/main.yml
- name: ensure mysql is at the latest version
yum: pkg={{ pkg }} state=latest
vi /etc/ansible/roles/mysql/vars/main.yml
pkg: mariadb*
-------編寫php模塊-----
vi /etc/ansible/roles/php/tasks/main.yml
- name: ensure php is at the latest version
yum: pkg={{ pkg }} state=latest
vi /etc/ansible/roles/php/vars/main.yml
pkg: php*
-----編寫roles示例-----
vi /etc/ansible/lamp.yml
- hosts: aaa
remote_user: root
roles:
- httpd
- mysql
- php
Ansible playbook及 示例