在Ansible的map与regex_replace中使用变量的问题
Ansible变量未解析问题:map+regex_replace中port变量未替换
问题场景
拥有名为fqdn_list的列表变量,结构如下:
{ "ansible_facts": { "fqdn_list": [ "domain.example1.com", " . . . ", "domain.exampleN.com" ] } }
尝试通过map结合regex_replace为每个元素添加端口号,编写任务如下:
- name: 'Creating url list' set_fact: url_list: "{{ fqdn_list | map('regex_replace', '$', ':{{ port }}') | list }}" vars: port: 8089
预期结果:每个域名后拼接:8089
实际结果:{{ port }}未被解析,直接作为字符串保留
解决方法
方法1:用字符串拼接运算符~提前解析变量
在regex_replace的替换参数中,用~将port变量和冒号拼接,确保变量被提前解析:
- name: 'Creating url list' set_fact: url_list: "{{ fqdn_list | map('regex_replace', '$', ':' ~ port) | list }}" vars: port: 8089
方法2:使用format过滤器实现拼接
利用format过滤器,将每个FQDN和端口号格式化拼接:
- name: 'Creating url list' set_fact: url_list: "{{ fqdn_list | map('format', '%s:' ~ port) | list }}" vars: port: 8089
方法3:通过loop逐个处理元素
如果偏好更直观的方式,可以初始化空列表后,循环逐个添加端口号:
- name: Initialize empty url list set_fact: url_list: [] - name: Add port to each FQDN set_fact: url_list: "{{ url_list + [item ~ ':' ~ port] }}" loop: "{{ fqdn_list }}" vars: port: 8089
内容的提问来源于stack exchange,提问作者Po_temkin
相关产品推荐
相关产品推荐

