使用Ansible从命令行渲染模板

时间:2015-11-28 10:44:40

标签: python ansible

我有一个Jenkins shell脚本,它有类似的东西从模板创建Nginx配置。

nginx.conf.j2

server {
  listen 80;
  server_name {{ server_name }};
  ...

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

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

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

ansible <host-pattern> -m template -a "src=nginx.conf.j2 dest=nginx.conf"

但是如何跳过<host-pattern>在本地执行?如何将环境变量传递给模板?

1 个答案:

答案 0 :(得分:1)

如果你需要强制Ansible在本地运行,你可以像这样创建一个只有localhost的inventory文件:

[local]
localhost ansible_host=127.0.0.1 ansible_connection=local

假设您将其保存到名为local的文件中,那么您将使用它:

ansible all -i local -m template -a "src=nginx.conf.j2 dest=nginx.conf"

或者您也可以使用稍微粗略的方式在CLI上直接提供清单:

ansible all -i "localhost," -m template -a "src=nginx.conf.j2 dest=nginx.conf" --connection=local

特别注意尾随,,因为这使得Ansible将其视为列表而非字符串,并且它希望库存为列表。

但是,听起来您似乎正在尝试使用Ansible替代您在问题中包含的Python代码段。如果您尝试上述内容(如评论中所述),您还会看到Ansible仅支持playbooks中的模板,而不支持ad-hoc命令。

相反,我建议你退一步,按照预期更多地使用Ansible,并使用Jenkins触发具有指定库存(包括你的Nginx盒子)的Ansible手册,然后配置Nginx。

一个非常基本的示例剧本可能看起来像这样:

- hosts: nginx-servers
  tasks:
    - name: Template nginx.conf
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf

主机中的nginx-servers对应于将如此定义的库存组块:

[nginx-servers]
nginx1.example.com
nginx2.example.com

有了这个,你可能会想要开始查看roles,这将大大提高重复使用你编写的许多Ansible代码的能力。