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. 根据简单条件来设定

此处逻辑设定

值得注意的是

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

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

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

值得注意的是

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

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

此时上面的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 }}"