我有一个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>
在本地执行?如何将环境变量传递给模板?
答案 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代码的能力。