[Ansible系列]ansible roles

目录

一.  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:webserver
  gather_facts: yes

  pre_tasks:
    - name: fireword.server
      service:
        name: firewalld
        state: stopped
        enabled: no

  post_tasks:
    - name: message info
      debug:
        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 nginx
  service:
    name: nginx
    state: restarted

- name: restart httpd
  service:
    name: httpd
    state: restarted
[root@clinet ansible_1]# cat roles/new_roles/tasks/main.yml 
- name: install & configure ngxin block
  block:
    - name: install nginx
      package:
        name: nginx
        state: present

    - name: configure nginx.conf
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        backup: yes
      notify: restart nginx

    - name: start ngixn
      service:
        name: nginx
        state: started
        enabled: yes
  when: ansible_ens33.ipv4.address in groups['proxy']

- name: install & configure httpd block
  block:
    - name: install httpd
      package:
        name: httpd
        state: present

    - name: confgure http.conf
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        backup: yes
      notify: restart httpd

    - name: start httpd
      service:
        name: httpd
        state: started
        enabled: yes
  when: ansible_ens33.ipv4.address in groups['webserver']

- name: copy file
  copy:
    src: xhz.txt
    dest: /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:webserver
  gather_facts: yes
  
  roles:
    - new_roles
[root@clinet ansible_1]# 
[root@clinet ansible_1]# 

 下面也是一个带入变量的示例:

[root@clinet ansible_1]# cat install_role.yml 
- hosts: proxy:webserver
  gather_facts: yes
  
  roles:
    - role: new_roles
      vars:
        dir1: '/xhz123'
        dir2: '/flf456'
[root@clinet ansible_1]# 
[root@clinet ansible_1]# 

也可以通过如下方法引用时带入变量: 

[root@clinet ansible_1]# cat install_role.yml 
- hosts: proxy:webserver
  gather_facts: yes
  
  roles:
    - {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:webserver
  gather_facts: yes
  
  roles:
    - {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:webserver
  gather_facts: yes

  pre_tasks:
    - name: fireword.server
      service:
        name: firewalld
        state: stopped
        enabled: no

  post_tasks:
    - name: message info
      debug:
        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


猜你喜欢

转载自blog.csdn.net/qq_43714097/article/details/129281682