ansible自动化运维,Roles(六)

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 按照功能进行拆分
ansible自动化运维,Roles(六)

例如:下面安装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

图示:

现在的剧本

ansible自动化运维,Roles(六)

现在的目录

ansible自动化运维,Roles(六)

2.2 Roles 执行顺序

	[root@m01 liu-ansible]# ansible-playbook -i hosts  top.yml 

按以上的Roles执行顺序为

  1. hosts #加载主机清单
  2. top.yml(roles.yml) #加载主剧本
  3. tasks/main.yml #加载任务
  4. lb-www-nginx.conf.j2 #加载jinja2变量
  5. 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

官方文档:传送门

上一篇:5.6--->Ansible中的角色使用


下一篇:03-变量