一、roles简介
将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色,角色一般存放在/etc/ansible/roles/目录下,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,如图:
每个角色的定义,以特定的层级目录结构进行组织。比如:
- files:存放有copy或script等模块调用的文件;
- templates:存放template模块查找所需要的模板文件的目录;
- tasks:任务存放的目录;
- handlers:存放相关触发执行器的目录;
- vars:变量存放的目录;
- meta:用于存放此角色元数据;
- default:默认变量存放的目录,文件中定义了此角色使用的默认变量;
上述目录中,tasks、handlers、vars、meta、default至少应该包含一个main.yaml文件,该目录下也可由其他.yaml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含起来。
二、简单的roles示例
$ mkdir roles
#创建一个目录,名称为roles。官方推荐在/etc/ansible/roles/这个目录,不过在哪里都是可以的
$ mkdir roles/nginx
$ cd roles/nginx/
$ mkdir tasks templates
$ cd tasks/
$ cat user.yaml
- name: create user
user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin
$ cat group.yaml
- name: create group
group: name=nginx gid=80
$ cat yum.yaml
- name: install package
yum: name=nginx
$ cat templ.yaml
- name: copy conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
$ cat stservice.yaml
- name: start service
service: name=nginx state=started enabled=yes
$ cat main.yaml
- include: group.yaml
- include: user.yaml
- include: yum.yaml
- include: templ.yaml
- include: stservice.yaml
#如果需要调用别的角色的yaml文件,也可以这样写,比如:- include:roles/httpd/tasks/copyfile.yaml
注意:copyfiile.yaml文件中的源路径必须是绝对路径
$ ls
nginx.conf.j2
#该文件就是nginx的配置文件改名了而已
$ cd ../../../
$ cat nginx.yaml
- hosts: webservers
remote_user: root
roles:
- role: nginx
#定义了多个角色,也可在接着写,每行调用一个角色
#也可以定义tags标签,比如:- { roles: httpd ,tags:['web','httpd']}或- { roles: httpd ,tags:'web' 如果需要加when语句,在此处添加 }都可以
$ ls
nginx.yaml roles
#确保调用nginx的yaml文件是和roles是在同一目录下的
$ tree
.
├── nginx.yaml
└── roles
└── nginx
├── tasks
│ ├── group.yaml
│ ├── main.yaml
│ ├── reservice.yaml
│ ├── stservice.yaml
│ ├── templ.yaml
│ ├── user.yaml
│ └── yum.yaml
└── templates
└── nginx.conf.j2
#确保目录的层次效果是这样的
$ ansible-playbook nginx.yaml
#如果定义了标签,就可对标签进行操作(比如:web或httpd)
$ ansible webservers -m shell -a 'ss -lntp | grep nginx'
#确认被控端的主机nginx已经启动
一个简单的nginx的roles已经编写完成了!
三、roles示例二
$ mkdir app
$ cd app/
$ mkdir tasks templates vars handlers files
$ cd tasks/
$ cat group.yaml
- name: create group
group: name=apache system=yes
$ cat user.yaml
- name: create user
user: name=apache group=apache system=yes shell=/sbin/nologin
$ cat yum.yaml
- name: install package
yum: name=httpd
$ cat templ.yaml
- name: copy file
template: src=httpd.conf.j2 dest=/etc/httpd/httpd.conf
notify: restart service
$ cat copyfile.yaml
- name: copy config
copy: src=vhosts.conf dest=/etc/httpd/conf.d/ owner=apache
$ cat start.yaml
- name: start service
service: name=httpd state=started
$ cat main.yaml
- include: group.yaml
- include: user.yaml
- include: yum.yaml
- include: templ.yaml
- include: copyfile.yaml
- include: start.yaml
$ ls files/vhosts.conf
files/vhosts.conf
#空文件用于测试
$ cat handlers/main.yaml
- name: restart service
service: name=httpd state=restarted
$ cat templates/httpd.conf.j2
#httpd的配置文件
$ cat vars/main.yaml
username: apache
groupname: apache
$ tree
.
├── files
│ └── vhosts.conf
├── handlers
│ └── main.yaml
├── tasks
│ ├── copyfile.yaml
│ ├── group.yaml
│ ├── main.yaml
│ ├── start.yaml
│ ├── templ.yaml
│ ├── user.yaml
│ └── yum.yaml
├── templates
│ └── httpd.conf.j2
└── vars
└── main.yaml
#目录结构
$ cat httpd.yaml
---
- hosts: webservers
remote_user: root
roles:
- httpd
$ ls
httpd.yaml nginx.yaml roles
#确保与roles目录在同一目录下
$ ansible-playbook httpd.yaml
$ ansible all -m shell -a 'ps -ef | grep apache'
//根据配置文件中修改的内容自行进行修改