简体   繁体   English

Ansible 'when' 条件中的多个 'and' 运算符

[英]Multiple 'and' operators in Ansible 'when' condition

This is the code that I am trying to run这是我要运行的代码

- name: Read and Register Contents of .bash_profile
  shell: grep -E 'AB_AG_HOME|AB_AG_LOCAL_ROOT|AB_AG_LOCAL_DIR|AB_AG_CONFIG_DIR|AB_AG_LOG_DIR' /home/username/.bash_profile
  register: output

- debug:
  msg: "{{ output.stdout_lines }}"

- name: Append AG environment variables in .bash_profile
shell: cat /home/{{ admin_user }}/tmp_bash.profile >> /home/{{ admin_user }}/.bash_profile
  when: "'AB_AG_HOME' and 'AB_AG_LOCAL_ROOT' and 'AB_AG_LOCAL_DIR' and 'AB_AG_CONFIG_DIR' and 'AB_AG_LOG_DIR' not in item"
with_items: "{{ output.stdout_lines }}"

- name: Delete the temporary tmp_bash.profile"
  file:
    path: /home/{{ abinitio_admin_user }}/tmp_bash.profile
    state: absent

when I run this code, all the values are repeated 4 times.当我运行这段代码时,所有的值都重复了 4 次。

Is there anything that is missing?有没有遗漏的东西?

By looping over the stdout_lines via通过循环遍历stdout_lines

with_items: "{{ output.stdout_lines }}"`

the condition条件

when: "'AB_AG_HOME' and 'AB_AG_LOCAL_ROOT' and 'AB_AG_LOCAL_DIR' and 'AB_AG_CONFIG_DIR' and 'AB_AG_LOG_DIR' not in item"

would only be true if all strings are in one line ( item ) together.仅当所有字符串都在一行 ( item ) 中时才为true

You may have a look into the following minimal example您可以查看以下最小示例

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

    result:
      stdout_lines:
        - "A1"
        - "A2"
        - "A3"
        - "A4"
        - "A5"

  tasks:

  - name: Debug one-line conditional
    debug:
      msg: "Not in stdout_lines"
    when: "'A1' and 'A2' and 'A3' and 'A4' and 'A5' not in result.stdout_lines"

Whereby the first given example get skipped because of the condition, the second example由于条件,第一个给定的示例被skipped ,第二个示例

  - name: Debug loop conditional
    debug:
      msg: "Not in {{ result.stdout_lines[ansible_loop.index0] }}"
    when: "'A1' and 'A2' and 'A3' and 'A4' and 'A5' not in item"
    loop: "{{ result.stdout_lines }}"
    loop_control:
      extended: true

will result into an output of将导致 output 的

TASK [Debug loop conditional] ******
ok: [localhost] => (item=A1) =>
  msg: Not in A1
ok: [localhost] => (item=A2) =>
  msg: Not in A2
ok: [localhost] => (item=A3) =>
  msg: Not in A3
ok: [localhost] => (item=A4) =>
  msg: Not in A4

For further debugging you could also use the assert module – Asserts given expressions are true .为了进一步调试,您还可以使用assert模块——断言给定表达式为真

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM