如果变量之一未定义,如何不在 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
这是我的脚本,我正在尝试使用循环向多个松弛通道发送消息。 我在变量中定义了变量。
- 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