{{ cat }}'s docs

1.6.1: LOGIC - 根据条件手动设定变量 - if else and when

1. set_fact基本用法

---
- name: set_fact basic usage
  set_fact:
    fact1: fact1_value
    php_ver: 5.6.40

- debug:
    msg: "\{\{ fact1 }}"

2. 根据简单条件来设定

此处逻辑设定

  • 对于[mysql, nginx, php-fpm]三个服务
  • 其中任意一个服务未启动,则设定lnmp_runningfalse ``` yaml

  • name: populate service facts service_facts:

值得注意的是

判断条件里面,增加判断lnmp_is_running是否被定义,是为了避免变量被重复覆盖

导致循环中只有最后一个元素的运行状态决定了lnmp_is_running的值得情况

所以这里增加判断,只要lnmp_is_running被定义了,其他元素就可以skip了

  • name: set lnmp_is_running false set_fact: lnmp_is_running: false when: lnmp_is_running is not defined and ansible_facts.services['{{item}}.service'].state != 'running' with_items: "{{ ['php-fpm', 'mysql', 'nginx'] }}" ignore_errors: yes

值得注意的是

如果when的条件全部元素都未达成,lnmp_is_running是不会被设定的,尝试使用它时会报错该变量未定义

所以上面使用了两个when来达到if else的效果

  • name: set lnmp_is_running true set_fact: lnmp_is_running: true when: lnmp_is_running is not defined

  • debug: msg: "{{ lnmp_is_running }}" ```

3. 根据复杂条件来设定

此处逻辑设定

  • 对于[mysql, nginx, php-fpm]三个服务
  • 其中任意一个服务未启动,则设定lnmp_runningfalse
  • 同时需要记录未启动的服务列表failed_services

增加一个前提,我们提前设定一个空列表failed_services

---
failed_services: []

此时上面的yaml就要改动一下

---
- name: populate service facts
  service_facts:

# 值得注意的是
# 判断条件里面,增加判断lnmp_is_running是否被定义,是为了避免变量被重复覆盖
# 导致循环中只有最后一个元素的运行状态决定了lnmp_is_running的值得情况
# 所以这里增加判断,只要lnmp_is_running被定义了,其他元素就可以skip了
- name: set lnmp_is_running false
  set_fact:
    lnmp_is_running: "\{\% if lnmp_is_running is not defined \%\}false\{\% else \%\}\{\{lnmp_is_running}}\{\% endif \%\}"
    failed_services: "\{\{ ports_listen_check }} + ['\{\{ item.port }}']"
  when: ansible_facts.services['\{\{item.name}}.service'].state != 'running'
  with_items: "\{\{ [{'name':'php-fpm','port':'81'}, {'name':'mysql','port':'3306'}, {'name':'nginx','port':'80'}] }}"
  ignore_errors: yes

# 值得注意的是
# 如果when的条件全部元素都未达成,lnmp_is_running是不会被设定的,尝试使用它时会报错该变量未定义
# 所以上面使用了两个when来达到if else的效果
- name: set lnmp_is_running true
  set_fact:
    lnmp_is_running: true
  when: lnmp_is_running is not defined

- debug:
    msg: "\{\{ lnmp_is_running }}"

Contents