Как обновить переменные ANSIBLE ролей через шаблон jinja2 - PullRequest
1 голос
/ 18 июня 2019

Я изучаю ансольные роли и пытаюсь установить переменные ролей, используя шаблон Jinja2. Но значения переменных не обновляются.

Вот рабочий каталог образец

sample
├── README.md
├── defaults
│   └── main.yml
├── files
│   └── main.out
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
│   └── main.j2
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

Содержимое папки vars / main.yml:

a: 2
b: 3
c: 0

Содержание задания / main.yml

---
 - name: Jagadish Sagi
   template:
           src: "sample2/templates/main.j2"
           dest: "sample2/files/main.out"
 - name: Printing value of c
   debug:
           var: c

Содержимое шаблонов / main.j2:

{% if a > b %}
{% set c = a %}
{% else %}
{% set c = b %}
{% endif %}
The Value of C : {{c}}

Код для выполнения роли:

---
 - hosts: localhost
   roles:
         - sample2

В файле files / main.out я получаю вывод

The Value of C : 3

Но в ANSIBLE playbook при печати на консоль выдает

ok: [localhost] => {
    "c": 0
}

Я знаю, что могу сделать это с помощью ansible только с помощью set_fact и, если еще, условий. но как я могу сделать это, используя Jinja2 Template тоже ??

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Я знаю, что могу сделать это, используя ansible только с помощью set_fact и, если еще, условий.но как я могу сделать это, используя Jinja2 Template тоже ??

Вы не можете;Шаблоны Jinja2 не изменяют свою среду, поскольку Jinja2 не является языком программирования, это разметка шаблонов.

Вы должны использовать set_fact:, чтобы изменить hostvars вашего прогона Playbook

0 голосов
/ 18 июня 2019

set, который вы используете в своем шаблоне, будет действителен только внутри вашего шаблона. Значение c остается неизменным для самого ansible. Если вам понадобится использовать это значение позже для других задач, вы не сможете сделать это таким образом.

порядок старшинства ролевых переменных все еще ниже, чем set_fact, поэтому это может помочь.

Между тем, если c - это всегда вычисляемая переменная, которая может изменяться в зависимости от a и b, это то, что я бы сделал.

  • объявляет a и b в роли по умолчанию, чтобы их можно было легко перегрузить в любой ситуации
---
# defaults/main.yml
a: 2
b: 3
  • объявляет c в ролях в зависимости от значений a и b
---
# vars/main.yml
c: "{{ (a > b) | ternary(a, b) }}"

Теперь вы можете использовать c везде, где хотите, с его правильным значением, без необходимости вычислять что-либо еще.

...