05-Ansible-Roles

357 阅读3分钟

Roles角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

  • 运维复杂的场景:建议使用roles,代码复用度高

Ansible Roles目录编排

img

roles目录结构

playbook.yml
roles/
project/
tasks/
files/
vars/
templates/
handlers/
default/
meta/

Roles各目录作用

tasks目录:角色需要执行的主任务文件放置在此目录中,默认的主任务文件名为main.yml,当调用角色时,默认会执行main.yml文件中的任务,你也可以将其他需要执行的任务文件通过include的方式包含在tasks/main.yml文件中。

handlers目录:当角色需要调用handlers时,默认会在此目录中的main.yml文件中查找对应的handler

defaults目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,通常,defaults/main.yml文件中的变量都用于设置默认值,以便在你没有设置对应变量值时,变量有默认的值可以使用,定义在defaults/main.yml文件中的变量的优先级是最低的。

vars目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,看到这里你肯定会有疑问,vars/main.yml文件和defaults/main.yml文件的区别在哪里呢?区别就是,defaults/main.yml文件中的变量的优先级是最低的,而vars/main.yml文件中的变量的优先级非常高,如果你只是想提供一个默认的配置,那么你可以把对应的变量定义在defaults/main.yml中,如果你想要确保别人在调用角色时,使用的值就是你指定的值,则可以将变量定义在vars/main.yml中,因为定义在vars/main.yml文件中的变量的优先级非常高,所以其值比较难以覆盖。

meta目录:如果你想要赋予这个角色一些元数据,则可以将元数据写入到meta/main.yml文件中,这些元数据用于描述角色的相关属性,比如 作者信息、角色主要作用等等,你也可以在meta/main.yml文件中定义这个角色依赖于哪些其他角色,或者改变角色的默认调用设定,在之后会有一些实际的示例,此处不用纠结。

templates目录: 角色相关的模板文件可以放置在此目录中,当使用角色相关的模板时,如果没有指定路径,会默认从此目录中查找对应名称的模板文件。

files目录:角色可能会用到的一些其他文件可以放置在此目录中,比如,当你定义nginx角色时,需要配置https,那么相关的证书文件即可放置在此目录中。

在playbook中调用role

树状结构

tree roles/nginx
roles/nginx
├── defaults
├── files
│   └── index.html
├── handlers
│   └── main.yaml
├── metas
├── tasks
│   └── main.yaml
├── templates
│   └── nginx.conf.j2
└── vars
    └── main.yaml

其中:

handlers/main.yaml文件内容如下:

- name: restarted nginx service
  service: 
    name: nginx 
    state: restarted

vars/main.yaml文件内容如下:

devil: nginx

tasks/main.yaml文件内容如下:

- name: add group nginx
  group: 
    name: nginx 
    gid: 80
    system: yes

- name: add user nginx
  user:
    name: nginx 
    uid: 80 
    group: nginx 
    shell: /sbin/nologin
    system: yes

- name: install nginx package
  yum:
    name: nginx
    
- name: create html directory
  file: 
    path: /etc/nginx/html 
    state: directory
    
- name: copy index.html file
  copy: 
    src: index.html 
    dest: /etc/nginx/html/index.html
    
- name: templates configfile
  template: 
    src: nginx.conf.j2 
    dest: /etc/nginx/nginx.conf 
    mode: 644
  notify:
    - restarted {{service}} service
    
- name: start nginx service
  service: 
    name: nginx 
    state: started
    enabled: yes 
- name: use vars
  shell: echo {{ devil }}

nginx.yaml 和roles目录平齐,内容如下:

- hosts: 192.168.176.128
  remote_user: root
  roles:
    - nginx

最后执行:

$ ansible-playbook nginx.yaml