我想将一些 Jinja 模板拆分成多行,以使行数保持在 120 个字符以下,并注册一个变量以便于重复使用。有没有办法做类似下面的事情?有没有内置(或社区)模块可以做到这一点?如果可能的话,我想在不使用临时文件的情况下做到这一点。
- jinja: "https://{{ username }}:{{ token }}@hosting.com/organization"
vars:
username: "{{ hashivault_secrets.value.data.USERNAME }}"
token: "{{ hashivault_secrets.value.data.TOKEN }}"
register: url
因此使用/重用可能看起来像
- pip:
name: my-internal-package
env:
PIP_EXTRA_INDEX_URL: "{{ url }}"
我目前正在使用 Ansible 2.9。
答案1
您可以直接设置一个 var:
vars:
url: https://{{ username }}:{{ token }}@hosting.com/organization
username: "{{ hashivault_secrets.value.data.USERNAME }}"
token: "{{ hashivault_secrets.value.data.TOKEN }}"
或者你可以使用set_fact
:
- set_fact:
url: https://{{ username }}:{{ token }}@hosting.com/organization
vars:
username: "{{ hashivault_secrets.value.data.USERNAME }}"
token: "{{ hashivault_secrets.value.data.TOKEN }}"
主要的实际区别(除了设置变量不需要额外的任务之外)是变量在使用时进行评估,因此url
如果hashivault_secrets
更改,第一个变量的值可能会随时间而变化,而第二个变量set_fact
将根据任务运行时对模板的评估得出静态值set_fact
。这两种行为都很有用,具体取决于具体情况。
答案2
您可以使用set_fact
。
- set_fact:
url: "https://{{ hashivault_secrets.value.data.USERNAME }}:{{ hashivault_secrets.value.data.TOKEN }}@hosting.com/organization"
答案3
变量可以定义为引用其他变量的表达式。允许将表达式拆分为合理的大小。
环境关键字可以应用于剧本的所有任务。这可以引用在任何地方定义的变量。
模块默认值还可用于在没有提供任何值时提供要使用的值。这通常对重复性事物(如 API 凭据)很有帮助。对于 pip 模块,提供了提供 --extra-index-url 的替代方法,因为模块提供了一种添加任意参数的方法。
group_vars/all/creds.yml 或者您想要定义配置变量的任何位置。
username: "{{ hashivault_secrets.value.data.USERNAME }}"
token: "{{ hashivault_secrets.value.data.TOKEN }}"
url: https://{{ username }}:{{ token }}@hosting.com/organization
env:
PIP_EXTRA_INDEX_URL: "{{ url }}"
play.yml 您没有提供剧本,但这里是使用适用于所有任务的剧本范围关键字的好地方。我将编写一个简单的剧本,根据您正在做的事情进行调整:
- hosts: thingapp
environment: "{{ env }}"
module_defaults:
pip:
extra_args: "--extra-index-url {{ url }}"
roles:
- webserver
- pythonapp
角色/pythonapp/任务/main.yml
- pip:
name: my-internal-package