有没有办法在条件过滤器中使用if..else逻辑?

时间:2019-04-29 16:51:51

标签: linux ansible

我想在一次播放中根据变量stdout对2个不同的值进行硬编码。如果服务正在运行,那么我想对值进行硬编码,否则就不好。如何在ansible中使用此逻辑?

我可以根据状态结果对一个值进行硬编码。

---
- hosts: localhost
  connection: local
  gather_facts: false
  vars:

  tasks:
  - name: load var from file
    include_vars:
      file: /tmp/var.json
      name: imported_var

  - name: Checking mysqld status
    shell: service mysqld status
    register: mysqld_stat

  - name: Checking mysqld status
    shell: service httpd status
    register: httpd_stat

  - name: append more key/values
    set_fact:
      imported_var: "{{ imported_var| default([]) | combine({ 'mysqld_status': 'good' })}}"
    when: mysqld_stat.rc == 0

  - name: append more key/values
    set_fact:
      imported_var: "{{ imported_var| default([]) | combine({ 'httpd_status': 'good' })}}"
    when: httpd_stat.rc == 0

  - name: write var to file
    copy:
      content: "{{ imported_var | to_nice_json }}"
      dest: /tmp/final.json

我想对mysqld_status进行硬编码:如果mysqld_stat.rc == 0或mysqld-status很好:如果mysqld_stat.rc = 0则不好。是否可以在单个命令中实现。 >

1 个答案:

答案 0 :(得分:1)

有许多方法可以解决此问题。您可以仅添加第二个set_fact,该时间在mysqld_stat.rc != 0时运行。在以下示例中,两个set_fact任务中只有一个会运行:

- name: append more key/values
  set_fact:
    imported_var: "{{ imported_var| default({}) | combine({ 'mysqld_status': 'good' })}}"
  when: mysqld_stat.rc == 0

- name: append more key/values
  set_fact:
    imported_var: "{{ imported_var| default({}) | combine({ 'mysqld_status': 'bad' })}}"
  when: mysqld_stat.rc != 0

您可以改用Ansible的三元过滤器:

- name: append more key/values
  set_fact:
    imported_var: "{{ imported_var| default({}) | combine({ 'mysqld_status': (mysqld_stat.rc == 0)|ternary('good', 'bad') })}}"