(1). Roles介绍
roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以通过:include简单的使用.
(2). Roles目录结构
roles: <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在:/etc/ansible/roles
project: <---具体的角色项目名称,比如nginx、tomcat、php
files: <--用来存放由copy模块或script模块调用的文件。
templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件.
tasks: <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件.
main.yml
handlers: <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作. -->
main.yml
vars: <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量 -->
main.yml
defaults: <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量 -->
main.yml
meta: <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系 -->
main.yml
(3). Roles案例
# 1. 进入到roles目录下
[root@manager ~]# cd /etc/ansible/roles/
# 2. 创建roles需要的目录
[root@manager roles]# mkdir -p nginx/{handlers,tasks,templates,vars}
# 3. 配置变量信息(vars/main.yml)
[root@manager roles]# cat > nginx/vars/main.yml <<EOF
listen: 81
server_name: _
root: /usr/share/nginx/html
EOF
# 4. 定义模板(templates/nginx.conf.j2)
# 注意:我省略掉了一些没用的信息
[root@manager roles]# cat nginx/templates/nginx.conf.j2
// ... ...
server {
listen ;
listen [::]:;
server_name ;
root ;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
// ... ...
# 5. 定义task(install nginx)
[root@manager roles]# cat > nginx/tasks/install.yml <<EOF
- name: "install nginx"
yum: name=nginx state=installed
tags: install
EOF
# 5. 定义task,定义配置模板(nginx.conf.j2)
[root@manager roles]# cat > nginx/tasks/config.yml <<EOF
- name: "config nginx.conf"
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
tags:
- install
- upgrade
EOF
# 5. 定义task(start)
[root@manager roles]# cat > nginx/tasks/start.yml <<EOF
- name: "start nginx"
service: name=nginx state=started enabled=yes
tags:
- install
- start
EOF
# 5. 定义task(stop)
[root@manager roles]# cat > nginx/tasks/stop.yml <<EOF
- name: "stop nginx"
service: name=nginx state=stopped
tags:
- stop
EOF
# 5. 定义task(main)
[root@manager roles]# cat > nginx/tasks/main.yml <<EOF
- include: install.yml
- include: config.yml
- include: stop.yml
- include: start.yml
EOF
# 6. 定义handler(restart)
[root@manager roles]# cat > nginx/handlers/restart.yml <<EOF
- name: restart nginx
service: name=nginx state=restarted
tags:
- restart
EOF
# 7. 编写主的playbook
[root@manager roles]# cd /etc/ansible/roles/nginx/
[root@manager nginx]# cat > nginx_roles.yml <<EOF
- hosts: erp
remote_user: root
gather_facts: no
roles:
- role: nginx
EOF
(4). 查看项目结构
[root@manager roles]# pwd
/etc/ansible/roles
[root@manager roles]# tree nginx
nginx
├── handlers
│ └── restart.yml # 我这里还缺少了一个main.yml.
├── nginx_roles.yml
├── tasks
│ ├── config.yml
│ ├── install.yml
│ ├── main.yml
│ ├── start.yml
│ └── stop.yml
├── templates
│ └── nginx.conf.j2
└── vars
└── main.yml
(5). 测试
# 1. 安装nginx
[root@manager nginx]# ansible-playbook -i /home/lixin/erp/hosts nginx_roles.yml -t install
PLAY [erp] ***********************************************************************************************************
TASK [install nginx] *************************************************************************************************
ok: [test]
TASK [config nginx.conf] *********************************************************************************************
ok: [test]
TASK [start nginx] ***************************************************************************************************
changed: [test]
PLAY RECAP ***********************************************************************************************************
test : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 2. 停止nginx
[root@manager nginx]# ansible-playbook -i /home/lixin/erp/hosts nginx_roles.yml -t stop
PLAY [erp] ***********************************************************************************************************
TASK [stop nginx] ****************************************************************************************************
ok: [test]
PLAY RECAP ***********************************************************************************************************
test : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 3. 启动nginx
[root@manager nginx]# ansible-playbook -i /home/lixin/erp/hosts nginx_roles.yml -t start
PLAY [erp] ***********************************************************************************************************
TASK [start nginx] ***************************************************************************************************
changed: [test]
PLAY RECAP ***********************************************************************************************************
test : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0