Ansible шаблоны и jinja {% block%} - PullRequest
       55

Ansible шаблоны и jinja {% block%}

0 голосов
/ 11 ноября 2019

Мне нужно сгенерировать один файл на удаленном хосте, используя несколько файлов шаблонов, и {% block block_name %} Джинджи в моей роли Ansible

Например,

main.conf.j2:

value1 = 123
value2 = 456

{% block test %} {% endblock %}

value3 = 789

{% block example %} {% endblock %}

value4 = abcd

test.conf.j2:

{% block test %}
more text here
{% endblock %}

example.conf.j2

{% block example %}
....
example_param = 'example!'
....
{% endblock %}

Какой следующий шаг? Я должен использовать {% extends 'nginx.conf.j2' %} в test.conf.j2 и example.conf.j2? И если так - как будет выглядеть мое задание Ansible? Или даже что-то еще?

Если я пытаюсь что-то вроде этого:

- name: Copy config
  template:
    src: "{{ item }}"
    dest: "{{ conf_file_path }}"
  with_items:
    - "main.conf.j2"
    - "test.conf.j2"
    - "example.conf.j2"
    - "abcd.conf.j2"

, это работает только для main.conf.j2 и test.conf.j2, но игнорирует example.conf.j2и другие шаблоны

1 Ответ

1 голос
/ 11 ноября 2019

Q: «Какой следующий шаг? Я ​​должен использовать {% extends 'nginx.conf.j2'%} ...?»

A: Да. extends необходимо. Например,

- template:
    src: test.j2
    dest: test

с шаблонами

$ cat main.j2
value1 = 123
{% block test %}
value = default value in main.j2
{% endblock %}
value3 = 789

$ cat test.j2 
{% extends 'main.j2' %}
{% block test %}
value = custom value in test.j2
{% endblock %}

дает

$ cat test 
value1 = 123
value = custom value in test.j2
value3 = 789

Q: "Как будет выглядеть мое задание Ansible?"

- name: Copy config
  template:
    src: "{{ item }}"
    dest: "{{ conf_file_path }}"
  with_items:
    - "main.conf.j2"
    - "test.conf.j2"
    - "example.conf.j2"
    - "abcd.conf.j2"

A: Цикл будет многократно перезаписывать файл dest в каждой итерации. См. шаблон .


FWIW. Можно использовать blockinfile и зацикливать поиск шаблонов. Например

- template:
    src: main2.j2
    dest: test
- blockinfile:
    marker: "# {mark} ANSIBLE MANAGED BLOCK {{ item }}"
    path: test
    block: "{{ lookup('template', item) }}"
  loop:
    - test.conf.j2
    - example.conf.j2

с шаблонами

$ cat main2.j2
value1 = 123

# BEGIN ANSIBLE MANAGED BLOCK test.conf.j2
value_test = default value in main2.j2
# END ANSIBLE MANAGED BLOCK test.conf.j2

# BEGIN ANSIBLE MANAGED BLOCK example.conf.j2
value_example = default value in main2.j2
# END ANSIBLE MANAGED BLOCK example.conf.j2

value3 = 789

$ cat test.conf.j2
value_test = custom value in test.conf.j2

$ cat example.conf.j2
value_example = custom value in example.conf.j2

предоставить

$ cat test 
value1 = 123

# BEGIN ANSIBLE MANAGED BLOCK test.conf.j2
value_test = custom value in test.conf.j2
# END ANSIBLE MANAGED BLOCK test.conf.j2

# BEGIN ANSIBLE MANAGED BLOCK example.conf.j2
value_example = custom value in example.conf.j2
# END ANSIBLE MANAGED BLOCK example.conf.j2

value3 = 789
...