1. 编写循环和条件任务
在playbook中使用循环,直接用loop关键字即可,有多种使用方法;
简单循环:
---
- name: test
hosts: rhel8_no1.test.com
tasks:
- name: apache and vsftpd is running
service:
name: "{{item}}" ##循环变量item ,从loop中取值
state: started
loop:
- httpd
- vsftpd
将变量放入列表:
---
- name: test
hosts: rhel8_no1.test.com
vars: ##定义变量
web_service:
- httpd
- vsftpd
tasks:
- name: apache and vsftpd is running
service:
name: "{{item}}"
state: started
loop: "{{web_service}}"
循环散列或字典列表:
---
- name: loop test
hosts: rhel8_no1.test.com
tasks:
- name: User test
user:
name: "{{item.name}}"
state: present
groups: "{{item.groups}}"
loop:
- name: student
groups: student
- name: redhat
groups: root
早些版本的循环,使用 with_items:
---
- name: loop test
hosts: rhel8_no1.test.com
vars:
data:
- user1
- user2
- user3
tasks:
- name: "with_items"
debug:
msg: "{{item}}"
with_items: "{{data}}"
register 和 loop 一起使用:
---
- name: loop register test
gather_facts: no
hosts: localhost
tasks:
- name: loop echo task
shell: "echo This is my item: {{ item }}"
loop:
- one
- two
register: echo_results
- name: Show echo results variable
debug:
var: echo_results
2. 条件任务语法
在ansible中,使用条件判断的关键字就是when,在表达式中你能够使用任何的变量或者fact,当表达式的结果返回的是false,便会跳过本次的任务。
简单布尔值测试:
---
- name: Boolean test
hosts: rhel8_no1.test.com
vars:
run_my_task: true ##定义变量
tasks:
- name: httpd is installed
yum:
name: httpd
when: run_my_task ##当run_my_task的值为true时,安装任务才会执行
测试变量是否有值:
---
- name: Boolean test
hosts: rhel8_no1.test.com
tasks:
- name: user test
user:
name: student
state: present
when: my_service is defined ##如果定义了 my_service这个变量,则执行判断用户是否存在的任务
以上palybook未定义my_service变量,任务不会被执行
条件表达式写法:
表达式 | 作用 |
---|---|
A== “B” | A与字符串B相等 |
A == 100 | 等于(数字) |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
!= | 不等于 |
xxx is defined | 变量存在 |
xxx is not defined | 变量不存在 |
1、true、yes | 均为布尔值 true |
0、false、no | 均为布尔值 false |
A in B | 第一个变量的值存在,且在第二个变量的列表中 |
示例:如果vsftpd服务正在运行,则重启httpd服务
---
- name: Restart httpd if vsftpd is running
hosts: rhel8_no1.test.com
tasks:
- name: Get vsftpd status
command: /usr/bin/systemctl is-active vsftpd ##判断vsftpd服务的状态
ignore_errors: yes ##如果 vsftpd 没运行或失败,则忽略
register: result ###定义变量保存结果
- name: Restart httpd
service:
name: httpd
state: restarted
when: result.rc == 0 ###退出码为 0,则重启 httpd
逻辑运算符:
- and:逻辑与,当左边和右边两个表达式同时为真,则返回真
- or:逻辑或,当左右和右边两个表达式任意一个为真,则返回真
- not:逻辑否,对表达式取反
- ():当一组表达式组合在一起,形成一个更大的表达式,组合内的所有表达式都是逻辑与的关系
3. 练习
①:vim test1.yml
##编写playbook,对web组的受管主机安装vsftpd和httpd软件,当主机的操作系统版本号为8.0时开启vsftpd与httpd服务
---
- name: httpd and vsftpd is running
hosts: web
vars:
web_pkg:
- vsftpd
- httpd
tasks:
- name: web_service is installed
yum:
name: "{{item}}"
state: present
loop: "{{web_pkg}}"
- name: Start httpd and vsftpd
service:
name: "{{item}}"
state: started
enabled: true
loop: "{{web_pkg}}"
when: ansible_distribution_version == "8.0"
②:ansible-playbook test1.yml
##运行playbook,输出结果说明所有主机安装软件成功,rhel7_no1.test.com主机未执行开启httpd,vsftpd服务的任务
③:查看受管主机的操作系统版本 ,rhel7_no1.test.com主机版本号为 7.6
④:查看受管主机上的httpd,vsftpd服务状态,验证实验结果