1. 程式人生 > >ansible-playbook組件解析及操作全解

ansible-playbook組件解析及操作全解

list use 準備 task 服務 遠程 少包 依賴 cts

轉載於http://www.178linux.com/7001

一、ansible-playbook介紹:

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

1、playbook基礎組件:

hosts playbook中的每一個paly的目的都是為了讓某個或某些以某個指定用戶的身份執行任務。hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分割主機組。

user remote_user則用於指定遠程主機上的執行任務的用戶。

任務列表:

play的主體部分是task list. task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務後再開始第二個。

action

任務執行過程

handlers

用於當前關註的資源發生變化時采取一定指定的操作

2、實例:

[root@node1 playbook]# cat web.yml
- hosts: test  \\主機組,在/etc/ansible/hosts定義
  remote_user: root  \\遠端執行任務的用戶
  tasks: \\任務
  - name: install httpd  \\任務描述
    command: yum -y install httpd  \\調用ansible的command模塊安裝httpd
  - name: provide httpd.conf \\任務描述
copy: src="/root/httpd.conf" dest="/etc/httpd/conf/httpd.conf" \\調用ansible的copy模塊,httpd安裝完成後將事先準備好的httpd.conf文件復制到/etc/httpd/conf目錄下
    tags: conf  \\給此任務打標記,可單獨執行標記的任務,使用 ansible-playbook -C 命令執行
    notify:  \\文件內容變更通知
    - server restart  \\通知到指定的任務
  - name: server start  \\任務描述
    service: name=httpd state=started enabled=true \\調用ansible的service模塊的屬性定義安裝完成httpd以後httpd服務的管理
  handlers: \\定義接受關註的資源變化後執行的動作
  - name: server restart  \\任務描述
    service: name=httpd state=restarted   \\當關註的資源發生變化後調用service模塊,采取的響應的動作
執行過程如下:
[root@node1 playbook]# ansible-playbook web.yml 

PLAY [test] ******************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [172.16.2.13]

TASK: [install httpd] ********************************************************* 
changed: [172.16.2.13]

TASK: [provide httpd.conf] **************************************************** 
changed: [172.16.2.13]

TASK: [server start] ********************************************************** 
changed: [172.16.2.13]

NOTIFIED: [server restart] **************************************************** 
changed: [172.16.2.13]

PLAY RECAP ******************************************************************** 
172.16.2.13                : ok=5    changed=4    unreachable=0    failed=0

二、ansible的roles介紹:

ansible的roles用於層次性、結構化地組織palybook。roles能夠根據層次型結構自動裝載變量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。

rules的組成:

root@node1 playbook]# tree  roles/
roles/ \\ansible所有的信息都放到此目錄下面對應的目錄中
└── nginx  \\角色名稱
    ├── default  \\為當前角色設定默認變量時使用此目錄,應當包含一個main.yml文件;
    ├── files  \\存放有copy或script等模塊調用的文件
    ├── handlers \\此目錄總應當包含一個main.yml文件,用於定義各角色用到的各handler
    ├── meta \\應當包含一個main.yml,用於定義角色的特殊設定及其依賴關系;1.3及以後版本支持
    ├── tasks \\至少包含一個名為main.yml的文件,定義了此角色的任務列表,可使用include指令
    ├── templates \\template模塊會自動在此目錄中尋找Jinja2模板文件
    └── vars  \\應當包含一個main.yml文件,用於定義此角色用到的變量

roles介紹完了,那麽我們就利用ansible的roles來配置nginx

1、首先按照上面的要求創建要用到的目錄

[root@node1 playbook]# mkdir -pv roles/nginx/{tasks,files,templates,handlers,vars,meta,default}

2、準備nginx配置文件

準備nginx.conf配置文件,使用模板文件配置
[root@node1 playbook]# cd roles/nginx/templates/
[root@node1 ~]# ansible all -m setup | grep ansible_processor_cores
        "ansible_processor_cores": 1,  \\獲取ansible的要調用的相關函數
[root@node1 playbook]# cd roles/nginx/templates/   \\模板文件一定要放到此目錄     
[root@node1 templates]# vim nginx.conf 
worker_processes {{  ansible_processor_cores }};  \\調用獲取到的函數
準備nginx的default.conf文件
[root@node1 playbook]# ls -l roles/nginx/files/
-rw-r--r--. 1 root root 1290 Nov 12  2014 default.conf

3、準備nginx的rpm包

[root@node1 playbook]# ls -l  roles/nginx/files/
-rw-r--r--. 1 root root   1290 Nov 12  2014 default.conf
-rw-r--r--. 1 root root 319456 Mar 29 20:44 nginx-1.4.7-1.el6.ngx.x86_64.rpm

4、在tasks目錄中配置任務列表

[root@node1 playbook]# cd  roles/nginx/tasks/
[root@node1 tasks]# vim  main.yml 
  - name: copy nginx.rpm
    copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm  dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
  - name: install nginx
    shell: yum -y  install /tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm
  - name: provides nginx.conf
    template: src=nginx.conf  dest=/etc/nginx/nginx.conf
    tags: nginxconf
    notify:
    - server restart
  - name: provides default.conf
    copy: src=default.conf dest=/etc/nginx/conf.d/default.conf 
    tags: nginxconf
  - name: server start
    service: name=nginx enabled=true state=started

5、在handlers目錄中配置定義handler信息

[root@node1 playbook]# cd roles/nginx/handlers/
[root@node1 handlers]# vim  main.yml 
- name: server restart
  service: name=nginx  state=restarted

6、在roles同一級目錄中創建site.yml文件

[root@node1 playbook]# cat site.yml 
- hosts: nginx
  remote_user: root
  roles:
  - nginx

7、應用配置:

[root@node1 playbook]# ansible-playbook site.yml 

PLAY [nginx] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [172.16.2.13]

TASK: [nginx | copy nginx.rpm] ************************************************ 
ok: [172.16.2.13]

TASK: [nginx | install nginx] ************************************************* 
changed: [172.16.2.13]

TASK: [nginx | provides nginx.conf] ******************************************* 
changed: [172.16.2.13]

TASK: [nginx | provides default.conf] ***************************************** 
changed: [172.16.2.13]

TASK: [nginx | server start] ************************************************** 
changed: [172.16.2.13]

NOTIFIED: [nginx | server restart] ******************************************** 
changed: [172.16.2.13]

PLAY RECAP ******************************************************************** 
172.16.2.13                : ok=7    changed=5    unreachable=0    failed=0

8、在node2主機上查看nginx是否已啟動

[root@node2 ~]# ss -tpln | grep 80
LISTEN     0      128                       *:80                       *:*      users:(("nginx",8934,8),("nginx",8936,8))

9、roles目錄總體結構:

[root@node1 playbook]# tree roles/
roles/
└── nginx
    ├── default
    ├── files
    │  ├── default.conf
    │  └── nginx-1.4.7-1.el6.ngx.x86_64.rpm
    ├── handlers
    │  └── main.yml
    ├── meta
    ├── tasks
    │  └── main.yml
    ├── templates
    │  └── nginx.conf
    └── vars

到此ansible常用的知識已介紹完畢,僅個人學習總結,大家有疑問的話可以一起交流

ansible-playbook組件解析及操作全解