目录
一. Roles简介
二. Roles基本构成
三. Role使用
3.1 playbook中引用roles
3.2 pre_tasks 和 post_tasks
3.3 role的依赖
四. Ansible Galaxy
一. Roles简介
在Ansible中,role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook的编写, 同时还使得它们非常易于复用。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。
二. Roles基本构成
[root@clinet ansible_1]# tree .
.
├── group_vars
├── host_vars
├── inventory
├── man.yml
└── roles└── new_roles├── defaults│ └── main.yml├── files├── handlers│ └── main.yml├── meta│ └── main.yml├── README.md├── tasks│ └── main.yml├── templates├── tests│ ├── inventory│ └── test.yml└── vars└── main.yml
[root@clinet ansible_1]#
Roles各个目录的作用:
1. group_vars:定义主机组变量,在group_vars目录中创建一个文件,文件的文件名称要与inventory清单中的组名称保持一致。
2. host_vars:定义主机变量,在host_vars目录中创建文件,文件的名称要与inventory清单中的主机名称保持一致,如果是ip地址,则创建相同ip地址的文件即可。
3. inventory:定义主机和主机组
4. main.yml:用于执行roles的playbook,该名称自定义,执行方式为ansible-playbook xx.yml
5. roles:存放自定义的roles文件和目录,该目录下new_roles表示一个工作角色,可以存在多个工作角色,每个工作角色目录中必须有上述结构中的文件和目录。
5.1 files:用于存放copy或script等模块调用的文件和脚本,也用于存放一些非模板文件的文件,如https证书等。
5.2 tempaltes:用于存放角色相关的Jinja2模板文件,当使用角色相关的模板时,如未明确指定模 板路径,则默认使用此目录中的模板。
5.3 tasks:角色所要执行的所有任务文件都存放于此,包含一个主文件main.yml,可以在主文件中 通过include的方式引入其他任务文件。
5.4 vars:用于定义此角色用到的变量,包含一个主文件main.yml,可以在主文件中 通过include的方式引入其他任务文件。
5.5 meta:用于存储角色的元数据信息,这些元数据用于描述角色的相关属性,包括作者,角色的 主要作用,角色的依赖关系等。默认这些信息会写入到当前目录下的main.yml文件中(可不写)。
5.6 defaults:除了vars目录,defaults目录也用于定义此角色用到的变量,与vars不同的是, defaults中定义的变量的优先级最低。(实际工作中我们经常将变更比较频繁的变量定义在该文件中)包含一个主文件main.yml,可以在主文件中 通过include的方式引入其他任务文件。
5.7 handlers:用于定义角色中需要调用 的handlers,包含一个主配置文件main.yml,可通过 include引入其他的handlers文件。
(tests目录可以不要)
创建role的步骤如下:
1. 创建以roles命名的目录
2. 在roles目录中分别创建角色名称命名的目录,如websrvs等
3. 在每个角色命名的目录中分别创建files、handlers、meta、tasks、teamplates和vars目录,用 不到的目录可以创建为空目录,也可以不创建。
4. 在playbook文件中,调用各角色
需要说明的是,以上目录并不都是必须的,如果你的roles当中并不需要用到某一个目录,也可 以不用创建,比如我们将所有的变量都放到defaults中,则可以不需要vars目录,如果未用到模 板文件,则不需要templates目录。(建议就当都是必要的,因为后面我们在通过ansible-galaxy init来创建roles的目录就是齐全的。)
三. Role使用
以部署nginx做负载均衡,httpd做后台web为例:
roles目录结构如下:
[root@clinet ansible_1]# tree .
.
├── ansible.cfg
├── group_vars
├── host_vars
├── inventory
├── man.yml
└── roles└── new_roles├── defaults│ └── main.yml├── files│ └── xhz.txt├── handlers│ └── main.yml├── meta│ └── main.yml├── README.md├── tasks│ └── main.yml├── templates│ ├── index.html.j2│ └── nginx.conf.j2└── vars└── main.yml
[root@clinet ansible_1]#
文件配置内容如下:
[root@clinet ansible_1]# cat inventory
[proxy]
192.168.194.132[webserver]
192.168.194.130
192.168.194.131
[root@clinet ansible_1]#
[root@clinet ansible_1]# cat man.yml
- hosts: proxy:webservergather_facts: yespre_tasks:- name: fireword.serverservice:name: firewalldstate: stoppedenabled: nopost_tasks:- name: message infodebug:msg: 'this playbook finished'roles:- new_roles
[root@clinet ansible_1]#
[root@clinet ansible_1]# cat roles/new_roles/defaults/main.yml
listen_port: 80
[root@clinet ansible_1]#
[root@clinet ansible_1]# cat roles/new_roles/files/xhz.txt
192.168.194.128
[root@clinet ansible_1]# cat roles/new_roles/handlers/main.yml
- name: restart nginxservice:name: nginxstate: restarted- name: restart httpdservice:name: httpdstate: restarted
[root@clinet ansible_1]# cat roles/new_roles/tasks/main.yml
- name: install & configure ngxin blockblock:- name: install nginxpackage:name: nginxstate: present- name: configure nginx.conftemplate:src: nginx.conf.j2dest: /etc/nginx/nginx.confbackup: yesnotify: restart nginx- name: start ngixnservice:name: nginxstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['proxy']- name: install & configure httpd blockblock:- name: install httpdpackage:name: httpdstate: present- name: confgure http.conftemplate:src: index.html.j2dest: /var/www/html/index.htmlbackup: yesnotify: restart httpd- name: start httpdservice:name: httpdstate: startedenabled: yeswhen: ansible_ens33.ipv4.address in groups['webserver']- name: copy filecopy:src: xhz.txtdest: /tmp/backup: yes
[root@clinet ansible_1]# cat roles/new_roles/vars/main.yml
user_name: nginx
[root@clinet ansible_1]#
[root@clinet ansible_1]#
3.1 playbook中引用roles
创建好roles之后,需要有playbook来进行引用roles,上述中的引用playbook就是install_role.yml
[root@clinet ansible_1]# cat install_role.yml
- hosts: proxy:webservergather_facts: yesroles:- new_roles
[root@clinet ansible_1]#
[root@clinet ansible_1]#
下面也是一个带入变量的示例:
[root@clinet ansible_1]# cat install_role.yml
- hosts: proxy:webservergather_facts: yesroles:- role: new_rolesvars:dir1: '/xhz123'dir2: '/flf456'
[root@clinet ansible_1]#
[root@clinet ansible_1]#
也可以通过如下方法引用时带入变量:
[root@clinet ansible_1]# cat install_role.yml
- hosts: proxy:webservergather_facts: yesroles:- {role: new_roles, dir1: '/xhz123',dir2: '/flf456'}
[root@clinet ansible_1]#
[root@clinet ansible_1]#
还可以在引用时使用条件语句:
[root@clinet ansible_1]# cat install_role.yml
- hosts: proxy:webservergather_facts: yesroles:- {role: new_roles, when: "ansible_os_family == 'xhz123'"}
[root@clinet ansible_1]#
[root@clinet ansible_1]#
3.2 pre_tasks 和 post_tasks
如果在执行一个role时,需要在其前或其后依然要执行某些任务,我们可以使用 pre_tasks 及 post_tasks 来声明。 pre_tasks 是在 role 之前执行,而 post_tasks 则在role之后执行。
[root@clinet ansible_1]# cat install_role.yml
- hosts: proxy:webservergather_facts: yespre_tasks:- name: fireword.serverservice:name: firewalldstate: stoppedenabled: nopost_tasks:- name: message infodebug:msg: 'this playbook finished'roles:- {role: new_roles, when: "ansible_os_family == 'xhz123'"}
[root@clinet ansible_1]#
3.3 role的依赖
如果当前role在执行前需要依赖另一个role,我们可以在roles的meta目录中的main.yml中定义role 的依赖关系。
示例1:
[root@clinet ansible_1]# cat roles/new_roles/meta/main.yml
dependencies:‐ { role: common, some_parameter: 3 }‐ { role: apache, port: 80 }‐ { role: postgres, dbname: blarg, other_parameter: 12 }
示例2:
[root@clinet ansible_1]# cat roles/new_roles/meta/main.yml
dependencies:‐ {role: ntp, ntp_server=ntp.ubuntu.com}‐ {role: web}‐ {role: memcached}
四. Ansible Galaxy
ansible-galaxy是一个工具,我们可以利用它快速的创建一个标准的roles目录结构,还可以通过它在 https://galaxy.ansible.com上下载别人写好的roles,直接拿来用。
通过ansible-galaxy初始化一个roles的目录结构,方法如下:
ansible‐galaxy init new_role
安装别人写好的roles:
ansible‐galaxy install ‐p /etc/ansible/roles bennojoy.mysql
-p:指定路径
默认从galaxy官网下载,官网地址:Ansible Galaxy
列出已安装的roles:
ansible‐galaxy list
查看已安装的roles信息:
ansible‐galaxy info bennojoy.mysql
卸载roles:
ansible‐galaxy remove bennojoy.mysql