我正在使用 Ansible 构建一个运行带有 Bind9 和 Freeradius 支持的 Samba Active Directory 的 Podman 容器,但遇到了一些障碍。
在我的容器中,Samba 使用 DLZ_BIND 作为后端运行良好,但我需要将 Freeradius 集成到容器中,这样我才能支持通过 VPN 登录。
我正在尝试模板化以下行/etc/freeradius/3.0/mods-available/mschap
:
ntlm_auth = "/usr/bin/ntlm_auth --allow-mschapv2
--request-nt-key
--username={mschap:User-Name}
--domain={{ ad_info.netbios_domain }}
--challenge=%{%{mschap:Challenge}:-00}
--nt-response=%{%{mschap:NT-Response}:-00}"
为了练习,你可以假设的{{ ad_info.netbios_domain }}
值为EXAMPLE
。
这是我在文件中使用 Jinja 变量的唯一地方。
然而,当运行 ansible-playbook 时,当 Ansible 尝试模板化文件时,它基本上会让 Ansible 崩溃。
我推测是因为 Jinja 变量插入到了引号字符串中?因为包含以下行的 BASH shell 脚本不会在 ansible 中崩溃:
SAMBA_ADMIN_PASSWORD="{{ ad_info.admin_password }}"
那么当您有一个带引号的字符串时,使用 Jinja 的正确方法是什么?
编辑
我制作了一个仅包含有问题的行的模板并从 ansible 收到以下错误:
failed: [myhost.example.com] (item=etc/freeradius/3.0/mods-available/mschap) =>
{
"ansible_loop_var": "item",
"changed": false, "item":
"etc/freeradius/3.0/mods-available/mschap-jinja",
"msg": "AnsibleError: template error while templating string: tag name expected.
String: ntlm_auth = \"/usr/bin/ntlm_auth
--allow-mschapv2
--request-nt-key
--username={mschap:User-Name}
--domain={{ ad_info.netbios_domain }}
--challenge=%{%{mschap:Challenge}:-00}
--nt-response=%{%{mschap:NT-Response}:-00}\"
"}
答案1
该组合{%
打开Jinja 声明。为了避免这种解释,请将括号放入变量中,例如
BR: '{{ "{" }}'
并在模板中使用它
shell> cat mschap.j2
ntlm_auth = "/usr/bin/ntlm_auth --allow-mschapv2
--request-nt-key
--username={mschap:User-Name}
--domain={{ ad_info.netbios_domain }}
--challenge=%{{ BR }}%{mschap:Challenge}:-00}
--nt-response=%{{ BR }}%{mschap:NT-Response}:-00}"
下面的任务应该可以完成这个工作
- template:
src: mschap.j2
dest: mschap
vars:
ad_info:
netbios_domain: EXAMPLE
给出
shell> cat mschap
ntlm_auth = "/usr/bin/ntlm_auth --allow-mschapv2
--request-nt-key
--username={mschap:User-Name}
--domain=EXAMPLE
--challenge=%{%{mschap:Challenge}:-00}
--nt-response=%{%{mschap:NT-Response}:-00}"