ansible角色role中使用条件判断when

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

在这里插入图片描述

然后继续进行语法测试:
在这里插入图片描述

这个报错是正常的,因为没有真正的安装,所以它不知道服务的状态

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值