roles
roles 介紹
ansible 自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次結構自動裝在邊梁文傑、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務、模塊以及處理器放置於單獨的目錄中,並可以邊界的include他們的一種機制。角色一般基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。
一個roles的案例如下所示:
site.yml
wevservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
wevservers/
files/
templates/
tasks/
handlers/
vars/
meta/
而在playbook中,可以這樣使用roles:
-hosts: wevservers
roles:
- common
- wevservers
也可以向roles傳遞參數,例如:
- hosts: webservers
roles:
- common
- { role: foo_app_instance, dir: '/opt/a', port: 5000 }
- { role: foo_app_instance, dir: '/opt/b', port: 5001 }
甚至也可以條件式地使用roles,例如:
- hostss: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
創建role的步驟
- 創建以roles命名的目錄;
- 在roles目錄中分別創建以各校色名稱命名的目錄,如webservers等;
- 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建;
- 在playbook文件中,調用各角色;
role內個目錄中可用的文件
目錄名 | 說明 |
---|---|
tasks目錄 | 至少應該包含一個名為main.yml的文件,其定義了此角色的任務列表;文件可以使用include包含其它的位於此目錄中的task文件; |
file目錄 | 存放由copy或script等模塊調用的文件; |
templates目錄 | template模塊會自動在此目錄中尋找Jinja2模板文件; |
handlers目錄 | 此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler中使用include包含的其它handler文件也應該位於此目錄中; |
vars目錄 | 應當包含一個main.yml文件,用於定義此角色用到的變量; |
meta目錄 | 因當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關系;ansible 1.3 及其以后的版本才支持; |
default目錄 | 為當前角色設定默認變量時使用此目錄,因當包含一個main.yml文件; |
案例
創建roles所需的目錄
[root@node-1 ansible]# mkdir -pv ansible_playbook/roles/{webservs,dbservs}/{tasks,files,templates,meta,handlers,vars}
[root@node-1 ansible]# tree ansible_playbook/
ansible_playbook/
└── roles
├── dbservs
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── webservs
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
以webservs來舉例
首先進入到webservs角色對應的目錄
[root@node-1 ansible_playbook]# cd roles/webservs/
[root@node-1 webservs]# ls
files handlers meta tasks templates vars
[root@node-1 webservs]# pwd
/etc/ansible/ansible_playbook/roles/webservs
然后拷貝httpd配置文件
[root@node-1 webservs]# cp /etc/httpd/conf/httpd.conf files/
定義tasks
[root@node-1 webservs]# cat tasks/main.yml
- name: install httpd package
yum: name=httpd state=present
- name: install configuration file
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
tags:
- conf
notify:
- restart httpd
- name: start httpd
service: name=httpd state=started
定義handlers
[root@node-1 webservs]# cat handlers/main.yml
- name: restart httpd
service: name=httpd state=restarted
然后到roles目錄下
[root@node-1 webservs]# cd ../../
[root@node-1 ansible_playbook]# pwd
/etc/ansible/ansible_playbook
[root@node-1 ansible_playbook]# ls
roles
定義site.yml
這里site.yml是固定用法
[root@node-1 ansible_playbook]# cat site.yml
- hosts: webservs
remote_user: root
roles:
- webservs
[root@node-1 ansible_playbook]# pwd
/etc/ansible/ansible_playbook
[root@node-1 ansible_playbook]# ls
roles site.yml
最后執行site.yml
[root@node-1 ansible_playbook]# ansible-playbook site.yml
PLAY [webservs] **********************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************
ok: [10.25.196.25]
TASK [webservs : install httpd package] **********************************************************************************************************************
changed: [10.25.196.25]
TASK [webservs : install configuration file] *****************************************************************************************************************
ok: [10.25.196.25]
TASK [webservs : start httpd] ********************************************************************************************************************************
changed: [10.25.196.25]
PLAY RECAP ***************************************************************************************************************************************************
10.25.196.25 : ok=4 changed=2 unreachable=0 failed=0
可以看到執行成功了,下面來查看一下
[root@node-1 ansible_playbook]# ansible webservs -m shell -a 'rpm -qa httpd'
[WARNING]: Consider using the yum, dnf or zypper module rather than running rpm. If you need to use command because yum, dnf or zypper is insufficient you
can add warn=False to this command task or set command_warnings=False in ansible.cfg to get rid of this message.
10.25.196.25 | SUCCESS | rc=0 >>
httpd-2.2.15-69.el6.centos.x86_64
[root@node-1 ansible_playbook]# ansible webservs -m shell -a 'ps aux | grep httpd'
10.25.196.25 | SUCCESS | rc=0 >>
root 19148 0.0 0.0 175536 3764 ? Ss 21:08 0:00 /usr/sbin/httpd
apache 19150 0.0 0.0 175536 2476 ? S 21:08 0:00 /usr/sbin/httpd
apache 19151 0.0 0.0 175536 2448 ? S 21:08 0:00 /usr/sbin/httpd
apache 19152 0.0 0.0 175536 2448 ? S 21:08 0:00 /usr/sbin/httpd
apache 19153 0.0 0.0 175536 2448 ? S 21:08 0:00 /usr/sbin/httpd
apache 19154 0.0 0.0 175536 2448 ? S 21:08 0:00 /usr/sbin/httpd
apache 19155 0.0 0.0 175536 2448 ? S 21:08 0:00 /usr/sbin/httpd
apache 19156 0.0 0.0 175536 2448 ? S 21:08 0:00 /usr/sbin/httpd
apache 19157 0.0 0.0 175536 2448 ? S 21:08 0:00 /usr/sbin/httpd
root 19335 0.0 0.0 106104 1128 pts/1 S+ 21:16 0:00 /bin/sh -c ps aux | grep httpd
root 19337 0.0 0.0 103260 832 pts/1 S+ 21:16 0:00 grep httpd
可以看到服務都是啟動正常的。
總結:
最后的site.yml中,可以定義多個hosts,分別執行不同的任務.這樣所有的代碼都可以被反復使用。
- 目錄名同角色名;
- 目錄結構有固定格式;