Ansible运行时能否传递同名变量实现多成员条件筛选?
解决Ansible通过--extra-vars传递多成员变量并筛选组的问题
正确传递多成员变量的方式
要一次性传递多个member值,需要将member定义为列表类型,以下几种方式都可行:
方式1:命令行直接传递JSON格式字符串
在类Unix shell(如Bash/Zsh)中,用单引号包裹JSON字符串,避免shell解析引号:
ansible-playbook test.yml -e '{"member": ["A", "B"]}'
如果是Windows CMD环境,需要转义双引号:
ansible-playbook test.yml -e "{\"member\": [\"A\", \"B\"]}"
方式2:通过变量文件传递
创建JSON格式变量文件(比如members_vars.json),内容如下:
{"member": ["A", "B"]}
然后通过@符号引用文件:
ansible-playbook test.yml -e @members_vars.json
方式3:直接传递列表格式字符串
Ansible会自动解析符合JSON格式的字符串为对应类型,也可以直接写:
ansible-playbook test.yml -e member='["A","B"]'
修改任务的筛选条件
原来的when条件只适用于member是单个字符串的场景,现在member是列表,需要判断目标组的成员列表和传入的member列表是否有交集(即组包含至少一个指定成员),修改后的任务如下:
- name: Add a domain user/group to a domain group win_domain_group_membership: name: "{{ item.key }}" members: "{{ item.value }}" state: pure with_dict: "{{ varlist }}" when: item.value | intersect(member) | length > 0
这里用intersect过滤器取两个列表的交集,再判断交集长度大于0,即可筛选出包含任一指定member的组。
你之前尝试的问题解析
-e member=A -e member=B:多次传递同名变量时,Ansible会用后面的变量覆盖前面的,最终member的值为B,只会筛选包含B的组。-e "member=A or B":这种方式会把member设为字符串"A or B",而非列表,任务中判断的是该字符串是否存在于组成员列表中,和你想要的多成员筛选逻辑完全不符。- JSON格式被忽略:大概率是shell的引号处理问题,比如在Windows CMD中直接用单引号包裹JSON会被识别为字符串的一部分,导致Ansible无法解析为列表,改用转义双引号或变量文件的方式即可解决。
内容的提问来源于stack exchange,提问作者m0l3cul3
相关产品推荐
相关产品推荐

