Ansible 自1.2版本引入的新特性,用于层次性、结构化地组织 Playbook。
Roles 能够根据层次型结构自动装载变量(vars)文件、tasks 以及 handlers 等。
简单来讲,Roles 就是分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的调用它们的一种机制。
从表面上看,Roles 就是一个目录。目录的名字也就是 Role 的名字。例如:
[root@wpf roles]# tree ./
./
└── nginx #角色项目名称
├── defaults #为当前角色设定默认变量
│ └── main.yml
├── files #存放由copy模块或script模块调用的文件
├── handlers #定义此角色中触发条件时执行的动作
│ └── main.yml
├── tasks #定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
│ └── main.yml
├── templates #存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
├── vars #定义此角色用到的变量
│ └── main.yml
└── meta #为此角色定义一些元数据
└── main.yml
注意: defaults、handlers、tasks、vars、meta,这几个子目录里面必须包含一个main.yml文件。
PS: 角色必须至少包含这些目录之一,但是最好排除任何未使用的目录。
·
·
---
- name: task control playbook example
hosts: wpf002
vars:
createuser:
- tomcat
- www
- mysql
tasks:
- name: create user
user: name="{{ item }}" state=present
with_items: "{{ createuser }}"
- name: yum install nginx
yum: name=nginx state=installed
- name: update nginx config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
tags: updateconfig
notify: reload nginx server
- name: add nginx virtualhost config
copy: src=wpf.com.conf dest=/etc/nginx/conf.d/
tags: updateconfig
notify: reload nginx server
- name: check nginx running
stat: path=/var/run/nginx.pid
register: nginxrunning
tags: updateconfig
- name: check nginx syntax
shell: /usr/sbin/nginx -t
register: nginxsyntax
tags: updateconfig
- name: start nginx
systemd: name=nginx state=started
when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == false
tags: updateconfig
handlers:
- name: reload nginx server
systemd: name=nginx state=reloaded
when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == true
tags: updateconfig
·
[root@wpf ~]# cd /etc/ansible/roles/
[root@wpf roles]# mkdir -p nginx/{vars,tasks,template,handlers,files}
[root@wpf roles]# touch nginx/{vars,tasks,handlers}/main.yml
[root@wpf roles]# tree nginx/
nginx/
├── files
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
·
files 文件夹存放文件
[root@wpf ~]# mv wpf.com.conf /etc/ansible/roles/nginx/files/
·
templates 文件夹存放模板
[root@wpf ~]# mv nginx.conf.j2 /etc/ansible/roles/nginx/templates/
·
handlers 文件夹中的 main.yml 文件
cat << EOF > /etc/ansible/roles/nginx/handlers/main.yml
---
- name: reload nginx server
systemd: name=nginx state=reloaded
when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == true
EOF
·
tasks 文件夹中的 main.yml 文件
cat << EOF > /etc/ansible/roles/nginx/tasks/main.yml
---
- name: create user
user: name="{{ item }}" state=present
with_items: "{{ createuser }}"
- name: yum install nginx
yum: name=nginx state=installed
- name: update nginx config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
tags: updateconfig
notify: reload nginx server
- name: add nginx virtualhost config
copy: src=wpf.com.conf dest=/etc/nginx/conf.d/
tags: updateconfig
notify: reload nginx server
- name: check nginx running
stat: path=/var/run/nginx.pid
register: nginxrunning
tags: updateconfig
- name: check nginx syntax
shell: /usr/sbin/nginx -t
register: nginxsyntax
tags: updateconfig
- name: start nginx
systemd: name=nginx state=started
when: nginxsyntax.rc == 0 and nginxrunning.stat.exists == false
tags: updateconfig
EOF
·
vars 文件夹中的 main.yml 文件
cat << EOF > /etc/ansible/roles/nginx/vars/main.yml
---
createuser:
- tomcat
- www
- mysql
EOF
·
Role 本身不能被直接执行,还是需要借助 Playbook 进行间接的调用。
- name: a playbook used role
hosts: wpf002
roles:
- nginx
在 Playbook 中给定 import_role 属性。这种方式适用于 Ansible 2.4 及以上。
- name: use rose
hosts: wpf002
tasks:
- debug:
msg: "Start execution nginx role"
- import_role:
name: nginx
- debug:
msg: "nginx role implement finish"