Asible管理变量和事实和实施任务控制
第三章 管理变量和事实
1、通过变量,可以轻松地在Ansible项目中管理给定环境的动态值,例如:
-要创建的用户
-要安装的软件包
-要重新启动的服务
-要删除的文件
-要从互联网检索的存档
2.变量由字符串组成,必须由字母开头,并且只能含有字母、数字和下划线
3.变量的定义方式
(1)playbook变量可通过多种方式定义。最简单的方式是将它放在playbook开头的vars块中。
(2)也可以在外部文件中定义playbook变量。此时不使用vars,使用vars_files指令,而后,以YAML格式在文件中定义playbook变量
第四章 实施任务控制
(一).使用循环来编写高效的任务,并使用条件控制运行任务的时间
1.使用loop关键字添加到任务中,将应对其迭代任务的项目列表取为值,循环变量item保存每个迭代过程中使用的值。例如:以下代码使用两次service模块确保两个网络服务处于运行状态
- name: Postfix is runningansible.builtin.service:name: postfixstate: started- name: Dovecot is runningansible.builtin.service:name: dovecotstate: started
使用loop循环将两个代码重新编写为一个简单循环
- name: Postfix and Dovecot are runningansible.builtin.service:name: "{{ item }}"state: startedloop: - postfix- dovecot
2.循环字典列表:以下示例中,列表中的每一项实际时字典,每个字典均有两个键
- name: Users exist and are in the correct groupsuser:name: "{{ item['name'] }}"state: presentgroups: "{{ item['groups'] }}"loop:- name: janegroups: wheel- name: joegroups: root
3.老版样式的循环关键字:with_items,可以和loop相互转换
vars:data:- user0- user1- user2
tasks:- name: "with_items"ansible.builtin.debug:msg: "{{ item }}"with_items: "{{ date }}"
条件任务语法:
when 语句只是任务中的又一个键,就如任务的名称及其所使用的模块一样。
when关键字的使用:
(1)使用or语句
(2)使用and运算符
(3)使用列表来描述条件列表
(4)使用括号分组来表达更复杂的条件语句
(二).实施仅在另一个任务更改托管主机时运行的任务(处理程序)
描述:在任务更改后才执行的任务——处理程序handlers,并且是在tasks下所有的任务都运行结束之后再执行
处理程序用于再任务对受管主机进行更改时执行额外操作,它们不应用作正常任务的替代。
(三).控制任务失败时发生的情况,以及导致任务失败的条件。
当任务失败时,ansible会跳过后续所有的任务。
如果想要任务失败后还继续执行play,可以使用下面几个方法:
1.忽略任务失败:
使用ignore_errors关键字
2.任务失败后强制执行处理程序
如果任务失败并且play在该主机中止,则收到play中早前任务通知的处理程序将不会运行。如果您在play中设置force_handlers:yes关键字,则即使play因为后续任务失败而终止也会调用被通知的处理程序。
注意:处理程序会在任务报告changed结果时获得通知,而在任务报告ok或者failed结果时不会获得通知。
3.指定任务失败条件
在任务中使用failed_when关键字来指定表示任务已失败的条件。这通常用于可能成功执行命令,但命令输出指示失败的命令模块。
4.指定任务何时报告“Changed"结果
使用changed_when关键字可以控制任务如何报告其已更改受管主机上的某些内容
- name: Validate httpd configurationansible.builtin.command: httpd -tchanged_when: falseregister: httpd_config_status
hanged_when: false
:因为 “验证配置” 这个操作,本身并不会对目标主机的系统状态(比如文件、服务等)产生实质性改变,只是做检查。所以通过设置 changed_when: false
,强制让这个任务执行后,changed
状态始终为 false
,这样在 Ansible 执行结果中,该任务就只会报告 ok
(如果命令执行成功,配置验证通过)或者 failed
(如果命令执行失败,配置有问题),而不会错误地显示 changed
。