目录
一、循环
1、简单循环
2、循环散列或字典列表
3、练习
二、条件
三、触发器
四、处理失败任务
1、ignore_errors
2、force_handlers
3、changed_when
4、failed_when
5、block
练习
一、循环
作用:循环迭代任务
1、简单循环
loop: ##赋值列表
- value1
- value2
- ...
{{item}} ##迭代变量名称
现在吧建立的东西删掉
2、循环散列或字典列表
如果现在建立的有文件有目录,就会涉及到字典或者是循环散列
loop:
- ...
- ...
创建成功
以上就是单层和使用字典方式书写多层
3、练习
安装并在火墙中设定 开启vsftpd apache dns
1 安装服务
2 开启服务
3 设置火墙
- name: setup vsftpd apache dns
hosts: all
vars:
services:
- name: vsftpd
service: vsftpd
firewall_name: ftp
- name: httpd
service: httpd
firewall_name: http
- name: bind
service: named
firewall_name: dns
tasks:
- name: install service
dnf:
name: "{{item['name']}}"
state: present
loop:
"{{services}}"
- name: start service
service:
name: "{{item['service']}}"
state: started
enabled: yes
loop:
"{{services}}"
- name: setup firewalld
firewalld:
service: "{{item['firewall_name']}}"
state: enabled
permanent: yes
immediate: yes
loop:
"{{services}}"
二、条件
when:
- 条件1
- 条件2
#条件判断#
= value == "字符串",value == 数字
< value < 数字
> value > 数字
<= value <= 数字
>= value >= 数字
!= value != 数字
is defined value value is defined 变量存在
is not defined value is not defined 变量不存在
in value is in value 变量为
not in value is not in value 变量不为
bool变量 为true value value的值为true
bool变量 false not value value的值为false
value in value2 value的值在value2列表中
多条条件组合
when:
条件1 and 条件2
- 条件1
- 条件2
when:条件1 or 条件2
when: >
条件1
or
条件2
现在就是报错就终止运行
当一个play出现问题其他全部终止
解决方法 :ignore_errors: yes即使出错也向下运行
即使报错依旧向下执行
现在判定文件是否存在
正常执行了
值设定了还是没设定
刚才部署服务的实验
需求有些需要开启火墙有些不需要
变量值为 xxx
开启服务的我只想在20上运行
30成功被跳过
如果是多个条件,使用列表
反选,就是not in
是否为ture
或者的话就用条件1 or 条件2
三、触发器
notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
使用超级用户来做
再次启动,配置什么都没有改变,但是会重启服务,这样不合理
配置文件没发生改变时不应该重启服务 ,触发器handlers和tasks一个级别
运行
因为配置文件没有改变
触发器就没有触发
这回触发器就触发了
handlers表示设定动作,notify表示如果哪个paly更改了服务器,就立即触发触发器中的指定动作,handlers下面也可以写很多动作
四、处理失败任务
1、ignore_errors
作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
vim test.yml
2、force_handlers
作用:
当任务失败后play被终止也会调用触发器进程
更改states的状态保证下次配置文件一定更新
3、changed_when
作用:
控制任务在何时报告它已进行更改changed_when: true强制play为更改状态
触发器每次都会触发
强制不更改
4、failed_when
当符合条件时强制任务失败
ailed_when:ture 强制某个play为执行失败状态
不管上面成不成功,他都视为执行失败
yes这个值会默认取到true
所以改为westos,为westos时执行失败
不会报错
5、block
block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务
改成正常的
正常运行rescue中的动作就被忽略了
练习
1、
把/dev/cdrom挂载到/mnt/isodir
检测/mnt/isodir是否存在
如果不存在 not exist 输出:/mnt/isodir is not exist
创建 create isodir
如果存在就直接挂载
- name: mount /dev/cdom play
hosts: all
tasks:
- block:
- name: check mount point
shell: test -e "/mnt/isodir"
rescue:
- name: show message
debug:
msg: /mnt/isodir is not exist
- name: create mount point
file:
path: /mnt/isodir
state: diretctory
always:
- name: mount cdrom
mount:
path: /mnt/isodir
src: /dev/cdrom
fstype: iso9660
state: mounted
2、
建立playbook ~/westos.yml要求如下:
建立大小为1500M名为/dev/vdb1的设备
如果/dev/vdb不存在请输入:
/dev/vdb is not exist
如果/dev/vdb大小不足2G请输出:
/dev/vdb is less then 2G
并建立800M大小的/dev/vdb1
此设备挂载到/westos上
首先需要先添加一块硬盘,大小1G,存在nodea地址,这一台主机就有两块硬盘了
1 - name: setup storage
2 hosts: all
3 tasks:
4 - name: create storage device
5 block:
6 - name: chreate 1500M device
7 parted:
8 device: /dev/sdb
9 number: 1
10 state: present
11 part_end: 1500MiB
12 when: ansible_facts['devices']['sdb'] is defined
13 rescue:
14 - name: create 800M device
15 parted:
16 device: /dev/sdb
17 number: 1
18 state: present
19 part_end: 800MiB
20 when: ansible_facts['devices']['sdb'] is defined
21
22 - name: show 800M device messages
23 debug:
24 msg: /dev/sdb is less then 2G
25 when: ansible_facts['devices']['sdb'] is defined
26 always:
27 - name: create westos dir
28 file:
29 name: /westos
30 state: directory
31 when: ansbile_facts['devices']['sdb'] is defined
32 - name: create filesystem for device
33 filesystem:
34 fstype: xfs
35 dev: /dev/sdb1
36 when: ansbile_facts['devices']['sdb'] is defined
37 - name: mount device
38 mount:
39 path: /westos
40 src: /dev/sdb1
41 fstype: xfs
42 state: mounted
43 when: ansbile_facts['devices']['sdb'] is defined
44 - name: then /dev/sdb is not found
45 debug:
46 msg: /dev/sdb is not exist
47 when: ansbile_facts['devices']['sdb'] is defined