ansible角色role中使用条件判断when
比如说再特定的情况下才去执行nginx角色的任务
---
- hosts: testB
remote_user: root
roles:
- { role: httpd, tags: ['web','httpd'] }
- { role: nginx, tags: ['web','nginx'], when: ansible_distribution_major_version == "7"}
- { role: app, tags: 'app' }
这次执行的时候不指定标签,所以默认按顺序全部执行
可以看到这里的app角色也执行了
因为我们这里的server2主机的版本就是7,所以nginx执行
我们再做一个测试:
将执行的条件改为ansible版本为6,则nginx不会执行
可以发现nginx角色直接被跳过
这里用一下模板和文件
将刚才创建的app角色目录删掉(这个角色里面复制的是nginx角色里的东西)
然后重新建立一个app角色目录,这个app里面包含的内容,我们尽可能将前面学到的东西用到里面
这回使用httpd服务来实现handler
mkdir app
cd app/
mkdir templates tasks handlers files vars
[root@server1 app]# tree
.
├── files
├── handlers
├── tasks
├── templates
└── vars
ls
files handlers tasks templates vars
testB组的主机中已经有httpd帐号了,所以这里清空环境
ansible testB -m shell -a 'rm -fr /data/'
ansible testB -m shell -a 'userdel -r apache'
ansible testB -m shell -a 'yum remove -y httpd'
假设我们想部署一个应用程序角色,这里里面用到了files handlers tasks templates vars这些内容,先去tasks中创建任务
1.创建用户
2.创建组
3.模版
4.必要的文件复制
5.准备相应的变量
cat group.yml
- name: create group
group: name=app system=yes
#system=yes指定创建的组为系统组
这里模拟应用所以使用app来代指,
创建用户:
确定123没有人用
cat user.yml
- name: create user
user: name=app group=app system=yes shell=/sbin/nologin uid=123
给group
cat group.yml
- name: create group
group: name=app system=yes gid=123
.yml文件中的组指定uidddd
写一个装包的剧本
cat yum.yml
- name: install package
yum: name=httpd
装完包,拷贝模板,所以需要拷贝一些模版过去
如果ansible主机装有httpd的话,查看本机的模版文件
我们这里将监听端口作为变量:
cp /etc/httpd/conf/httpd.conf ../templates/httpd.conf.j2
cd ../templates/
vim httpd.conf.j2
Listen {{ ansible_processor_vcpus*10 }}
我们这里将监听端口定义为变量系统cpu个数*10,
我们将用户也使用变量来实现
cat vars/main.yml
- username: app
- groupname: app
将模版指定完后,指定一个触发器notify,触发一个重启服务(handler中的东西,handler的name和notify后面的内容一样)
创建一个handler放在一个独立的文件夹下
cat templ.yml
- name: copy conf
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
定义handler
cat handlers/restart.yml
- name: restart service
service: name=httpd state=restarted
定义服务启动的任务:
cat tasks/start.yml
- name: start service
service: name=httpd state=started enabled=yes
Service模块的enabled参数为yes时表示该服务开机启动
这里的file模块还没有用过,这里拷贝一个配置文件过去
cat tasks/copyfile.yml
- name: copy config
copy: src=vhosts.conf dest=/etc/httpd/conf.d
创建一个配置文件(这个配置文件是httpd的虚拟主机的配置文件)
files里面存放copy模块使用的源文件
我们把文件初步的写好了,然后进到tasks中,写一个main.yml来定义任务执行的次序
cat main.yml
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: copyfile.yml
- include: start.yml
这个服务不一定能启动,因为我们定义的是app,yum安装完后,要把文件夹所有者都设置成apache,但是我们创建的用户app,所以这里可能会有问题
因为我们的ansible主机已经按好了httpd,所以看一下两个用到的配置文件的目录的属主和属组有没有是apache的,如果没有则可以启动,就不会影响了
可以发现两个文件夹没有使用apache做属主和属组的目录和文件
所以这里试一试能不能运行:
cat app_role.yml
---
- hosts: testB
remote_user: root
roles:
- role: app
检测app_role.yml的语法:
发现报错,说变量username和 gourpname有问题:
然后发现它们格式有问题:
前面没有-,所以将前面的-删掉
cat roles/app/vars/main.yml
username: app
groupname: app
这里报错说请求触发动作restart service没有在main.yml中找到
所以我们将handlers目录下的restart.yml改为main.yml
mv roles/app/handlers/restart.yml roles/app/handlers/main.yml
然后继续进行语法测试:
这个报错是正常的,因为没有真正的安装,所以它不知道服务的状态