如果变量之一未定义,如何不在 ansible 中循环

How to NOT to loop in ansible if one of the variable is undefined

这是我的脚本,我正在尝试使用循环向多个松弛通道发送消息。 我在变量中定义了变量。

    - name: send msg to slack
      community.general.slack:
         token: XXXXXXXXXXXX
         blocks:
           - type: section
             text:
              type: mrkdwn
              text: |-
               ****text message********
         channel: '{{ item.slack_channel }}'
         username: 'slackbot'
         parse: 'full'
      loop: "{{ slack | default([]) | selectattr('slack_channel') | list }}"
      when: inventory_hostname ==  'abc.xyz'

变量

slack:
      - slack_channel: '#mychannel'
      - slack_channel: '{{ slackchannel1|default(None) }}'
      - slack_channel: '{{ slackchannel2|default(None) }}'

slackchanne1 和 slackchannel2 变量是可选的,有时我会定义值但有时我不会定义值

我要的是-

触发脚本时,必须将消息发送到所有松弛通道,但如果未定义变量,那么我不希望循环到 运行 并失败,以防万一 运行 并且没有找到变量那么它不应该说播放失败,它必须跳过那个循环因为没有为变量 slackchannel1 和 slackchannel2 定义值,最后播放应该成功与单个定义的变量 vlaue - slack_channel:#我的频道

我收到错误

fatal: [abc.xyz]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'msg'\n\nThe error appears to be in 'tasks/slack.yml': line 303, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: send msg to slack\n      ^ here\n"}

使用默认值(None)避免错误"'slackchannel1'未定义"

    slack:
      - slack_channel: '#mychannel'
      - slack_channel: '{{ slackchannel1|default(None) }}'
      - slack_channel: '{{ slackchannel2|default(None) }}'

然后,select个定义项

loop: "{{ slack | default([]) | selectattr('slack_channel') | list }}"

引用自selectattr

If no test is specified, the attribute’s value will be evaluated as a boolean.


例如剧本

shell> cat playbook.yml
- hosts: localhost
  vars:
    slack:
      - slack_channel: '#mychannel'
      - slack_channel: '{{ slackchannel1|default(None) }}'
      - slack_channel: '{{ slackchannel2|default(None) }}'

  tasks:
    - debug:
        msg: "{{ item.slack_channel }}"
      loop: "{{ slack | default([]) | selectattr('slack_channel') | list }}"
shell> ansible-playbook playbook.yml

给予

ok: [localhost] => (item={'slack_channel': '#mychannel'}) => 
  msg: '#mychannel'

定义变量时

shell> ansible-playbook playbook.yml -e slackchannel2=test

剧本给出

ok: [localhost] => (item={'slack_channel': '#mychannel'}) => 
  msg: '#mychannel'
ok: [localhost] => (item={'slack_channel': 'test'}) => 
  msg: test