目录
一、roles概述
二、角色的使用
1.角色(roles):角色集合
2.roles建议存放位置
3.调用角色的方法
(1)调用角色方法1
(2)调用角色方法2
4.完整的角色架构
三、Ansible Roles目录编排
四、roles目录
(一)roles目录结构
(二)roles各目录作用
(三)创建角色的步骤
五、使用role安装nginx服务
1.配置步骤
2.卸载所有与nginx有关的内容
3.主控机新建两个文件夹,一个放任务,一个放模板
(1)准备工作
4.编写脚本
(1)编写group.yml和user.yml脚本
(2)编写yum.yml安装nginx
(3)编写启动服务脚本——start.yml和restart.yml
(4)更改nginx配置文件
(5)定义模板文件——templ.yml
(6)定义工作流文件——main.yml
(7)编写playbook调用角色
(8)编写后的目录结构
5.检查并执行nginx_role.yml脚本
6.检查被控机是否安装成功
(1)检查nginx服务是否开启
(2)检查被控机是否创建了对应数量的nginx-worker数量
六、使用role安装httpd服务
1.编写tasks
2.卸载已经安装的httpd服务与apache用户
3.编写脚本
(1)创建user.yml
(2)创建copyfile.yml
(3)定义主配置文件main.yml
(4)编写playbook使用角色——httpd_role.yml
(5)执行playbook脚本
(6)检查被控机是否生成对应的配置文件和账号
(7)文件目录
七、一个角色调用另一个角色(也可以调用多个角色)
1.撤销之前的所有操作
2.编写playbook脚本同时调用httpd和nginx——some_role.yml
3.执行脚本
4.查看执行结果
八、在某个角色中引用另外一个角色的任务
1.修改nginx下的main.yml
2.撤销之前的步骤
3.修改copyfile.yml中的路径为绝对路径
4.执行脚本
5.检查结果,服务已启动
1.复制一个role,叫app
2.给some_role.yml脚本加上标签
3.执行脚本中的web标签
4.在特定条件下执行nginx角色
(1)修改some_role.yml脚本
(2)执行脚本
playbook是一个脚本,而roles是一堆脚本。roles是将playbook中的信息拆散,按照一定的逻辑关系,存放在不同的路径下。例如roles将playbook中的变量放在一个文件夹中,将模板也放在一个文件夹中,甚至任务也可以拆分放到独立的文件夹中,可以重复调用。
roles/
mysql/
httpd/
nginx/
memcached/
建议放在/etc/ansible/roles目录下,不放在这里也可以
[root@ansible145 ansible]# mkdir roles
[root@ansible145 ansible]# mkdir roles/{httpd,mysql,memcache,nginx} -pv
mkdir: created directory ‘roles/httpd’
mkdir: created directory ‘roles/mysql’
mkdir: created directory ‘roles/memcache’
mkdir: created directory ‘roles/nginx’
[root@ansible145 ansible]# tree
.
└── roles
├── httpd
├── memcache
├── mysql
└── nginx
/roles/project/ :项目名称,有以下子目录
- files/:存放由copy或script模块等调用的文件;
- templates/:template模块查找所需要模板文件的目录;
- tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含(已过时);
- handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
- vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
- meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含(已过时);
- default/:设定默认变量时使用此目录中的main.yml文件。
1.group:nginx
2.user:nginx
3.yum:nginx
4.template:nginx.conf.j2
5.service:nginx
# 主控机卸载nginx服务
yum remove nginx
# 卸载被控机的nginx服务
ansible all -m yum -a 'name=nginx state=absent'
# 查看被控机是否安装nginx服务
ansible all -m shell -a 'rpm -q nginx'
# 查看是否有nginx用户
ansible all -m shell -a 'getent passwd nginx'
# 查看是否有nginx用户组
ansible all -m shell -a 'getent group nginx'
# 进入/data/ansible/roles/nginx/目录下,创建两个文件
[root@ansible145 nginx]# mkdir tasks templates
[root@ansible145 nginx]# ls
tasks templates
# 进入tasks目录下,创建用户组和用户
[root@ansible145 nginx]# cd tasks/
# 首先可以指定用户组和用户的id
# 查看id是否被占用
[root@ansible145 ~]# ansible all -m shell -a 'getent passwd |grep 80'
192.168.22.143 | FAILED | rc=1 >>
non-zero return code
192.168.22.141 | FAILED | rc=1 >>
non-zero return code
192.168.22.142 | FAILED | rc=1 >>
non-zero return code
# id没有被占用,开始创建yml脚本
[root@ansible145 tasks]# vim group.yml
- name: create group
group: name=nginx gid=80
[root@ansible145 tasks]# vim user.yml
- name: create user
user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin
[root@ansible145 tasks]# vim yum.yml
- name: install package
yum: name=nginx
[root@ansible145 tasks]# vim start.yml
- name: start service
service: name=nginx state=started enabled=yes
# 注意:重启服务一般会放在handlers中,这里先放在这里
[root@ansible145 tasks]# vim restart.yml
- name: restarted service
service: name=nginx state=restarted
# 如果主控机没有安装nginx,需要安装
yum install nginx
# 将nginx的配置文件复制到/data/ansible/roles/nginx/templates目录下
[root@ansible145 templates]# cp /etc/nginx/nginx.conf nginx.conf.j2
# 修改第6行的内容,将auto改为cpu核数+2
[root@ansible145 templates]# vim nginx.conf.j2
5 user nginx;
6 worker_processes {{ ansible_processor_vcpus+2 }};
7 error_log /var/log/nginx/error.log;
# 切换目录
[root@ansible145 templates]# cd ../tasks
# 编写脚本
[root@ansible145 tasks]# vim templ.yml
- name: copy conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
[root@ansible145 tasks]# vim main.yml
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml
注意:调用指定角色的playbook文件要和roles是平级的。
[root@ansible145 ansible]# vim nginx_role.yml
- hosts: websrvs
remote_user: root
roles:
- role: nginx
[root@ansible145 ansible]# ansible-playbook -C nginx_role.yml
[root@ansible145 ansible]# ansible-playbook nginx_role.yml
# 创建任务文件夹
[root@ansible145 httpd]# mkdir tasks
[root@ansible145 httpd]# cd tasks/
# 查看是否有apache用户
[root@ansible145 tasks]# getent passwd apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
# 卸载被控机已安装的httpd
ansible all -m yum -a 'name=httpd state=absent'
# 查询httpd是否成功卸载
ansible all -m shell -a 'rpm -q httpd'
# 删除apache用户
ansible all -m user -a 'name=apache state=absent remove=yes'
# 查看apache用户是否被成功删除
ansible all -m shell -a 'getent passwd apache'
[root@ansible145 httpd]# vim user.yml
- name: create user
user: name=apache system=yes shell=/sbin/nologin
编译安装时,需要先创立好编译安装的所有数据,准备好数据后,将安装目录打包,传入安装目录上。
[root@ansible145 httpd]# mkdir files
[root@ansible145 httpd]# rpm -qa httpd
httpd-2.4.6-99.el7.centos.1.x86_64
[root@ansible145 httpd]# cp /etc/httpd/conf/httpd.conf files/
[root@ansible145 tasks]# vim copyfile.yml
- name: copy files
copy: src=httpd.conf dest=/data/ owner=apache
[root@ansible145 tasks]# vim main.yml
- include: user.yml
- include: copyfile.yml
[root@ansible145 ansible]# vim httpd_role.yml
- hosts: websrvs
remote_user: root
roles:
- httpd
[root@ansible145 ansible]# ansible-playbook httpd_role.yml
[root@ansible145 ansible]# ansible websrvs -m shell -a 'ls -l /data/ | grep httpd.conf'
192.168.22.141 | CHANGED | rc=0 >>
-rw-r--r-- 1 apache root 11752 Jul 21 23:23 httpd.conf
192.168.22.142 | CHANGED | rc=0 >>
-rw-r--r-- 1 apache root 11752 Jul 21 23:23 httpd.conf
[root@ansible145 ansible]# ansible websrvs -m shell -a 'getent passwd apache'
192.168.22.141 | CHANGED | rc=0 >>
apache:x:996:994::/home/apache:/sbin/nologin
192.168.22.142 | CHANGED | rc=0 >>
apache:x:995:994::/home/apache:/sbin/nologin
将两个不同的角色同时作用在同一组服务中去
# 卸载被控机的httpd
[root@ansible145 ansible]# ansible all -m user -a 'name=apache state=absent'
# 删除被控机的apache用户
[root@ansible145 ansible]# ansible all -m shell -a 'rm -rf /data/*'
# 卸载被控机的nginx
[root@ansible145 ansible]# ansible all -m shell -a 'yum -y remove nginx'
# 删除被控即的nginx用户
[root@ansible145 ansible]# ansible all -m shell -a 'userdel -r nginx'
[root@ansible145 ansible]# vim some_role.yml
- hosts: websrvs
remote_user: root
roles:
- role: nginx
- role: httpd
[root@ansible145 ansible]# ansible-playbook some_role.yml
在nginx中使用httpd中的copyfile.yml任务
[root@ansible145 ansible]# vim roles/nginx/tasks/main.yml
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml
- include: roles/httpd/tasks/copyfile.yml
注意:当在同一个角色下时,只需要写上文件名即可。
当在不同的角色下时,需要写上对应的文件路径。
[root@ansible145 ansible]# ansible all -m shell -a 'rm -rf /data/*'
因为是两个角色下,这里被调用的角色下的文件需要写绝对路径。
[root@ansible145 ansible]# vim roles/httpd/tasks/copyfile.yml
- name: copy files
copy: src=/etc/httpd/conf/httpd.conf dest=/data/ owner=apache
[root@ansible145 ansible]# ansible-playbook nginx_role.yml
[root@ansible145 roles]# cp -r nginx/ app/
- hosts: websrvs
remote_user: root
roles:
- { role: httpd, tags: ['web','httpd']}
- { role: nginx, tags: ['web','nginx']}
- { role: app, tags: "app"}
即使some_role.yml中三个标签,也只会调用http和nginx这两个角色。
[root@ansible145 ansible]# ansible-playbook -t web some_role.yml
[root@ansible145 ansible]# vim some_role.yml
- hosts: all
remote_user: root
roles:
- { role: httpd, tags: ['web','httpd']}
- { role: nginx, tags: ['web','nginx'],when: ansible_distribution_major_version == "7"}
- { role: app, tags: "app"}
[root@ansible145 ansible]# ansible-playbook some_role.yml