将渲染的 Jinja 保存到变量

将渲染的 Jinja 保存到变量

我想将一些 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

相关内容