如何在Ansible的when语句中正确扩展多个变量?
解决Ansible Playbook中when语句的变量替换问题
问题原因
你之前的两种写法都存在语法或变量解析问题:
- 第一种写法
'HOSTNAME_CONVENTION{:02d}'.format(item)中,HOSTNAME_CONVENTION被包裹在单引号内,被当作静态字符串而非变量解析,所以实际检查的是类似HOSTNAME_CONVENTION01这样的主机名,自然无法匹配EXISTING_HOSTNAMES中的host-namexx格式条目。 - 第二种写法
HOSTNAME_CONVENTION'{:02d}'.format(item)存在语法错误,变量与字符串字面量之间没有正确的拼接/格式化逻辑,导致Ansible模板引擎解析失败,报错:模板错误:模板化字符串时出错:期望语句块结束标记,却得到了字符串。
正确写法
有两种等效的正确方式可以实现需求:
方式1:沿用NEXT_HOSTNAME的拼接逻辑
直接把变量和格式化后的数字部分拼接,再判断是否在已存在列表中:
when: "{{ HOSTNAME_CONVENTION }}{{ '{:02d}'.format(item) }} not in EXISTING_HOSTNAMES"
方式2:用format同时传入变量和数字
更简洁的写法,把HOSTNAME_CONVENTION作为参数传给format方法:
when: "'{}{:02d}'.format(HOSTNAME_CONVENTION, item) not in EXISTING_HOSTNAMES"
完整修正后的Playbook片段
- name: Identify next available hostname ansible.builtin.set_fact: NEXT_HOSTNAME: "{{ HOSTNAME_CONVENTION }}{{ '{:02d}'.format(item) }}" loop: "{{ range(1, 99) | reverse | list }}" when: "'{}{:02d}'.format(HOSTNAME_CONVENTION, item) not in EXISTING_HOSTNAMES"
内容的提问来源于stack exchange,提问作者npcarling26
相关产品推荐
相关产品推荐

