使用 Ansible 从命令行渲染模板

war*_*iuc 5 python ansible

我有一个 Jenkins shell 脚本,其中包含类似的内容,可以从模板创建 Nginx 配置。

nginx.conf.j2

server {
  listen 80;
  server_name {{ server_name }};
  ...
Run Code Online (Sandbox Code Playgroud)

将所有环境变量传递给模板的渲染过程:

env server_name=$SERVER_NAME \
  python - <<'EOF' > "nginx.conf"
import os, jinja2
template = jinja2.Template(open(os.environ["nginx.conf.j2"]).read())
print template.render(**os.environ)
EOF
Run Code Online (Sandbox Code Playgroud)

如何使用 Ansible 做同样的事情?我想可能是这样的:

ansible <host-pattern> -m template -a "src=nginx.conf.j2 dest=nginx.conf"
Run Code Online (Sandbox Code Playgroud)

但如何跳过<host-pattern>本地操作呢?如何将环境变量传递给模板?

yda*_*coR 5

如果您需要强制 Ansible 在本地运行,您可以创建一个仅包含 localhost 的清单文件,如下所示:

[local]
localhost ansible_host=127.0.0.1 ansible_connection=local
Run Code Online (Sandbox Code Playgroud)

假设您将其保存到名为您的文件中,local然后将像这样使用它:

ansible all -i local -m template -a "src=nginx.conf.j2 dest=nginx.conf"
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用稍微有点黑客的方式,直接在 CLI 上提供清单作为列表:

ansible all -i "localhost," -m template -a "src=nginx.conf.j2 dest=nginx.conf" --connection=local
Run Code Online (Sandbox Code Playgroud)

特别注意尾随,,因为这使得 Ansible 将其视为列表而不是字符串,并且它期望清单是列表。

但是,听起来您正在尝试使用 Ansible 作为问题中包含的 Python 代码片段的替代品。如果您尝试上述操作(如评论中所述),您还会看到 Ansible 仅支持 playbook 中的模板,而不支持临时命令中的模板。

相反,我建议您退一步,更多地使用 Ansible,因为它是预期的,并使用 Jenkins 触发具有指定清单(包括您的 Nginx 盒子)的 Ansible playbook,然后配置 Nginx。

一个非常基本的示例剧本可能如下所示:

- hosts: nginx-servers
  tasks:
    - name: Template nginx.conf
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)

其中nginx-servers主机中的 对应于一个清单组块,其定义如下:

[nginx-servers]
nginx1.example.com
nginx2.example.com
Run Code Online (Sandbox Code Playgroud)

有了这个,您可能想要开始寻找角色,这将大大提高重用您编写的大量 Ansible 代码的能力。