第三章 管理变量和事实

1、通过变量,可以轻松地在Ansible项目中管理给定环境的动态值,例如:

-要创建的用户

-要安装的软件包

-要重新启动的服务

-要删除的文件

-要从互联网检索的存档

2.变量由字符串组成,必须由字母开头,并且只能含有字母、数字和下划线

3.变量的定义方式

(1)playbook变量可通过多种方式定义。最简单的方式是将它放在playbook开头的vars块中。

(2)也可以在外部文件中定义playbook变量。此时不使用vars,使用vars_files指令,而后,以YAML格式在文件中定义playbook变量

第四章 实施任务控制

(一).使用循环来编写高效的任务,并使用条件控制运行任务的时间

1.使用loop关键字添加到任务中,将应对其迭代任务的项目列表取为值,循环变量item保存每个迭代过程中使用的值。例如:以下代码使用两次service模块确保两个网络服务处于运行状态

- name: Postfix is running
  ansible.builtin.service:
    name: postfix
    state: started

- name: Dovecot is running
  ansible.builtin.service:
    name: dovecot
    state: started

使用loop循环将两个代码重新编写为一个简单循环

- name: Postfix and Dovecot are running
  ansible.builtin.service:
    name: "{{ item }}"
    state: started
  loop: 
    - postfix
    - dovecot

2.循环字典列表:以下示例中,列表中的每一项实际时字典,每个字典均有两个键

- name: Users exist and are in the correct groups
  user:
    name: "{{ item['name'] }}"
    state: present
    groups: "{{ item['groups'] }}"
  loop:
    - name: jane
      groups: wheel
    - name: joe
      groups: 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 configuration
  ansible.builtin.command: httpd -t
  changed_when: false
  register: httpd_config_status

hanged_when: false:因为 “验证配置” 这个操作,本身并不会对目标主机的系统状态(比如文件、服务等)产生实质性改变,只是做检查。所以通过设置 changed_when: false,强制让这个任务执行后,changed 状态始终为 false,这样在 Ansible 执行结果中,该任务就只会报告 ok(如果命令执行成功,配置验证通过)或者 failed(如果命令执行失败,配置有问题),而不会错误地显示 changed

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐