一、循环
循环迭代任务
1.简单循环
loop: ##赋值列表
- value1
- value2
- ...
{{item}} ##迭代变量名称
实例
2.循环散列或字典列表
例题
受控主机上安装httpd .vsftpd. dhcp-server
并且建立两个用户
westosuser1 组id 444 家目录:/mnt/westosusr1
westosuser2 组id 6666 家目录: /mnt/westosuser2
两个用户的附加组是21
---
- name: test
hosts: 172.25.12.1
tasks:
- name: dnf software
dnf:
name: "{{item.name}}"
state: present
loop:
- name: dhcp-server
- name: httpd
- name: vsftpd
- name: create group
group:
name: "{{item.name}}"
gid: "{{item.gid}}"
state: present
loop:
- name: westosuser1
gid: 4444
- name: westosuser2
gid: 6667
- name: westosuser
gid: 21
ignore_errors: yes
- name: create user
user:
name: "{{item.name}}"
group: "{{item.group}}"
groups: "{{item.groups}}"
home: "{{item.home}}"
loop:
- name: westosuser1
group: 4444
groups: 21
home: /mnt/westosuser1
- name: westosuser2
group: 6667
groups: 21
home: /home/westosuser2
二.条件
when:
- 条件1
- 条件2
#条件判断#
= value == "字符串",value == 数字
< value < 数字
> value > 数字
<= value <= 数字
>= value >= 数字
!= value != 数字
is defined value value is defined 变量存在
is not defined value is not defined 变量不存在
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
三.触发器
notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
四.处理失败任务
1.ignore_errors
#作用:
当play遇到任务失败是会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
#实例#
- name: test
dnf:
name: westos
state: latest
ignore_errors: yes
- name: create file
file:
path: /mnt/westos
state: touch
- force_handlers
作用:当任务失败后play被终止也会调用触发器进程
3.changed_when
作用: 控制任务在何时报告它已进行更改
4.failed_when 当符合条件时强制任务失败
5.block
block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务
测试练习#
建立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上
---
- name: disk
hosts: all
tasks:
- name: check dev_vdb
debug:
msg: "{{ansible_facts.enp1s0.ipv4.address }} is not exist with /dev/vdb"
when: ansible_facts.devices.vdb is not defined
- name: test block
block:
- name: create 1500M vdb1
parted:
device: /dev/vdb
number: 1
state: present
part_end: 1.5GiB
when: ansible_facts.devices.vdb is defined
rescue:
- name: create disk
parted:
device: /dev/vdb
number: 1
state: present
part_end: 800MiB
- debug:
msg: "{{ansible_facts.enp1s0.ipv4.address}} is less then 1500 MiB "
always:
- name: filesystem
filesystem:
dev: /dev/vdb1
fstype: xfs
when: ansible_facts.devices.vdb is defined
- name: mounted
mount:
path: /westos
src: /dev/vdb1
fstype: xfs
state: mounted
when: ansible_facts.devices.vdb is defined