1. 更为规范的组织方式 Roles
1.1 各种yml文件多了,特别容易混乱
例如:
[root@m01 playbook]# ls
' 11-handers-nginx-conf.yml liu-ansible php-www.conf
03_lnp.yml 11-loop-two-vars.yml liu-ansible.tar.gz rsyncd.conf
04-show-vars.yml 12.yml lnmp.yml rsyncd.yml
05-group-vars-show.yml 14-jinjia-template-motd.yml motd.j2 web-index.php
06-reg-var-ip.yml 15-jinja-template-lb.yml nfs.yml
08-when-config-repo.yml group_vars nginx-conf-muban.j2
10-loop-two-vars.yml lb-www-nginx.conf.j2 nginx-php-www.conf
1.2 Roles 文件的组织方式
我们可以按照自己的文件组织方式,将各种文件进行分类,比如nginx任务相关的放在nginx目录下,mysql相关的放在mysql的目录下,负载均衡相关的放在lb的目录下...
另外,ansible也设计好了各类文件的组织方式。
关于roles,需要学习的就是它的文件组织方式
1.3 Role 文件结构一览
role 可以组织任务,变量,handler以及其它的一些内容,所以一个完整的Role里包含的目录和文件可能比较多,手动去创建所有这些目录和文件是一件比较烦人的事。ansible 提供了ansible-galaxy init ROLE_NAME命令来快速创建一个符合Role文件组织规范的框架。比如
[root@m01 liu-ansible]# ansible-galaxy init lnmp_role
- Role lnmp_role was created successfully
[root@m01 liu-ansible]# tree lnmp_role/
lnmp_role/
|-- README.md
|-- defaults
| `-- main.yml
|-- files
|-- handlers
| `-- main.yml
|-- meta
| `-- main.yml
|-- tasks
| `-- main.yml
|-- templates
|-- tests
| |-- inventory
| `-- test.yml
`-- vars
`-- main.yml
8 directories, 8 files
1.4 多个Role的存放规范
有了一个lnmp的role后,还会有更多的role,比如创建一个Happroxy的role,创建一个lb-nginx的role ,所以为了组织多个role,通常会将每个role放在一个roles(top)的目录下,即:
[root@m01 liu-ansible]# cat top.yml
- hosts: lb
roles:
- role: lb-nginx
1.5 按照功能进行拆分
例如:下面安装lb负载功能进行组织一个role
2.组织多个文件 Roles
案例: 通过template模块 分发 lb nginx负载均衡配置
2.1 Roles 总览
[root@m01 liu-ansible]# ls
group_vars hosts lb-nginx top.yml
[root@m01 liu-ansible]# tree -F lb-nginx/
lb-nginx/
|-- files/ #各种不需要的配置文件,直接发过去
|-- handlers/ #触发文件
| `-- main.yml
|-- tasks/ #剧本文件
| `-- main.yml
`-- templates/ #配置文件模板(一般包含变量)
`-- lb-www-nginx.conf.j2
4 directories, 3 files
[root@m01 liu-ansible]# tree -F group_vars/
group_vars/
`-- all/
`-- main.yml #变量
1 directory, 1 file
图示:
现在的剧本
现在的目录
2.2 Roles 执行顺序
[root@m01 liu-ansible]# ansible-playbook -i hosts top.yml
按以上的Roles执行顺序为
- hosts #加载主机清单
- top.yml(roles.yml) #加载主剧本
- tasks/main.yml #加载任务
- lb-www-nginx.conf.j2 #加载jinja2变量
- handlers/main.yml #触发剧本
以下为内容
top.yml(roles.yml)
[root@m01 liu-ansible]# cat top.yml
- hosts: lb
roles:
- role: lb-nginx
tasks/main.yml
[root@m01 lb-nginx]# cat tasks/main.yml
- name: fenfa lb conf
template: #类似copy模块,但是可以把存放变量,并在对方主机实现
src: lb-www-nginx.conf.j2
dest: /etc/nginx/conf.d/www-nginx-play.conf
backup: yes
notify:
- Restart nginx
lb-www-nginx.conf.j2
[root@m01 lb-nginx]# cat templates/lb-www-nginx.conf.j2
{#
server_name yuming
http_port duankouhao
#}
upstream {{server_name}}{
{% for i in range(7,10) %}
server 172.16.1.{{i}}:{{http_port}} weight=1 max_fails=3 fail_timeout=30s;
{% endfor %}
}
server {
listen {{http_port}};
server_name {{server_name}};
location / {
proxy_pass http://{{server_name}};
proxy_set_header Host $host;
proxy_set_header X_Forwarded_For $remote_addr;
}
}
handlers/main.yml
[root@m01 lb-nginx]# cat handlers/main.yml
- name: Restart nginx
systemd:
name: nginx
state: restarted