本篇博客实验环境详见ansible的部署以及基本模块的使用
把playbooks中需要编写的yml文件分为多个角色,方便管理。
[devops@server1 ansible]$ mkdir roles
[devops@server1 ansible]$ ansible-galaxy list ##查看角色列表
[devops@server1 ansible]$ cd roles/
[devops@server1 roles]$ ansible-galaxy init httpd ##创建角色
- httpd was created successfully
角色 | 作用 |
---|---|
files | 用来存放由copy模块或script模块调用的文件。 |
templates | 用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。 |
tasks | 此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。 |
handlers | 此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。 |
vars | 此目录应当包含一个main.yml文件,用于定义此角色用到的变量。 |
defaults | 此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。 |
meta | 此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。 |
我们发现,这些角色其实就是将本来比较长的一个playbook的yml文件分开到不同的目录罢了如前面用到的部署httpd服务的代码:
---
- hosts: webservers ##声明作用的主机
vars: ##角色1
http_port: 8080
tasks: ##角色2
- name: install httpd
yum:
name: httpd
state: latest
- name: create index.html
copy:
content: "{{ ansible_facts['hostname'] }}\n"
dest: /var/www/html/index.html
tags: index
- name: configure httpd
template:
src: templates/httpd.conf
dest: /etc/httpd/conf/httpd.conf
owner: root
group: root
mode: 644
notify: restart httpd
- name: start httpd
service:
name: httpd
state: started
enabled: true
- name: start firewalld
service:
name: firewalld
state: started
enabled: true
- name: configure firewalld
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
handlers: ##角色3
- name: restart httpd
service:
name: httpd
state: restarted
我们发现,以上代码标注的角色 vars, tasks, handler在上面生成的目录中都一一对应下面我们上面的代码拆分为一个个角色,深入了解一下怎么去写一个playbook的角色文件。
首先,先写vars角色
[devops@server1 httpd]$ ls
defaults files handlers meta README.md tasks templates vars
[devops@server1 httpd]$ vim vars/main.yml
[devops@server1 httpd]$ ls
defaults files handlers meta README.md tasks templates vars
[devops@server1 httpd]$ vim tasks/main.yml
---
- name: install httpd
yum:
name: httpd
state: latest
- name: create index.html
copy:
content: "{{ ansible_facts['hostname'] }}\n"
dest: /var/www/html/index.html
tags: index
- name: configure httpd
template:
src: templates/httpd.conf
dest: /etc/httpd/conf/httpd.conf
owner: root
group: root
mode: 644
notify: restart httpd
- name: start httpd
service:
name: httpd
state: started
enabled: true
- name: start firewalld
service:
name: firewalld
state: started
enabled: true
- name: configure firewalld
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
和上面task模块下的内容一样。
接下来,写 handlers角色
[devops@server1 httpd]$ ls
defaults files handlers meta README.md tasks templates vars
[devops@server1 httpd]$ vim handlers/main.yml
最后是templates角色
[devops@server1 httpd]$ cd templates/
[devops@server1 templates]$ ls
httpd.conf
[devops@server1 templates]$ vim httpd.conf
这个目录放的是httpd服务的主配置文件,端口是vars角色设定的{{ http_port }},方便后面做端口修改的测试。
这样就把一个yml文件拆分为多个角色了,但是大家会发现,还没有定义主机。
[devops@server1 ansible]$ vim apache.yml
---
- hosts: all ##定义主机
roles:
- httpd ##定义角色
我们要使httpd这整个大的角色跑起来,要在ansible的主配置文件进行编写一个总的yml文件,定义操作的主机,之后在推送这个yml文件就可以了。
[devops@server1 ansible]$ ansible-playbook apache.yml
推送成功,在测试一下我们创建的httpd角色是否可以实现相应的功能
[devops@server1 ansible]$ vim roles/httpd/vars/main.yml
[devops@server1 ansible]$ ansible-playbook apache.yml