本篇博客实验环境详见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

ansible用 yaml 的hosts_html


可以看到目录内生成的这些文件和目录。

角色

作用

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

ansible用 yaml 的hosts_apache_02


内容就和上面var模块的内容一样

同样,写task角色

[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

ansible用 yaml 的hosts_html_03

最后是templates角色

[devops@server1 httpd]$ cd templates/
[devops@server1 templates]$ ls
httpd.conf
[devops@server1 templates]$ vim httpd.conf

ansible用 yaml 的hosts_html_04


这个目录放的是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

ansible用 yaml 的hosts_vim_05


推送成功,在测试一下我们创建的httpd角色是否可以实现相应的功能

[devops@server1 ansible]$ vim roles/httpd/vars/main.yml

ansible用 yaml 的hosts_vim_06


编写vars角色,看端口是否能修改。

[devops@server1 ansible]$ ansible-playbook apache.yml

ansible用 yaml 的hosts_vim_07


推送。

ansible用 yaml 的hosts_vim_08


查看远程主机的端口,成功修改了,所以将一个yml文件分为多个角色成功了。