我有一个 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>本地操作呢?如何将环境变量传递给模板?
如果您需要强制 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 代码的能力。