Ansible技术问询:如何转义LAPS密码Fact中的双大括号?
解决Ansible中LAPS密码含{{/}}导致的执行失败问题
我们的Ansible剧本通过LAPS获取系统密码并赋值给fact,用于连接远程服务器执行角色,多数情况正常。但偶然出现LAPS生成的密码包含{{字符导致执行失败,因LAPS特性无法复现该场景。当前使用的代码如下:
- name: Get password using gssapi auth set_fact: lapsPass: "{{ lookup('laps_password', host, domain=kdc) }}" delegate_to: 127.0.0.1 - name: Run role include_role: name: my_role vars: ansible_user: adminuser ansible_password: "{{ lapsPass }}" ansible_become: yes ansible_become_method: runas ansible_become_user: adminuser ansible_become_pass: "{{ lapsPass }}"
我们试过用{% raw %}...{% endraw %}标签,但无效,现给出转义密码中{{或}}字符的可行方案:
可行解决方案
1. 用string过滤器强制转为纯字符串
在获取密码时,通过string过滤器将lookup结果转为纯字符串,阻止Ansible模板引擎解析其中的模板标记。修改后的set_fact任务如下:
- name: Get password using gssapi auth set_fact: lapsPass: "{{ lookup('laps_password', host, domain=kdc) | string }}" delegate_to: 127.0.0.1
2. 直接在角色调用中使用带过滤器的lookup结果
如果担心set_fact环节仍会触发模板解析,可以跳过fact中转,直接在include_role的变量里调用带string过滤器的lookup:
- name: Run role include_role: name: my_role vars: ansible_user: adminuser ansible_password: "{{ lookup('laps_password', host, domain=kdc) | string }}" ansible_become: yes ansible_become_method: runas ansible_become_user: adminuser ansible_become_pass: "{{ lookup('laps_password', host, domain=kdc) | string }}" delegate_to: 127.0.0.1
注意:如果担心两次lookup获取的密码不一致,优先用第一种方案先把密码存为fact。
3. 结合cacheable参数确保字符串缓存
如果需要跨任务复用密码,可以给set_fact加上cacheable参数,确保fact被当作纯字符串缓存,避免后续环节的意外解析:
- name: Get password using gssapi auth ansible.builtin.set_fact: lapsPass: "{{ lookup('laps_password', host, domain=kdc) | string }}" delegate_to: 127.0.0.1 cacheable: yes
原理说明
Ansible的模板引擎会自动识别变量中的{{和}},将其当作模板表达式解析。而string过滤器会强制把lookup返回的结果转为纯字符串类型,彻底阻断模板引擎对这些特殊字符的解析逻辑,从而避免因密码包含模板标记导致的语法错误。
内容的提问来源于stack exchange,提问作者Lagamorph
相关产品推荐
相关产品推荐

