【问题标题】:Ansible templates and jinja {%block%}Ansible 模板和 jinja {%block%}
【发布时间】:2019-11-10 22:13:14
【问题描述】:

我需要在远程主机上使用多个模板文件和 Jinja 的 {% 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 %}

下一步是什么?我必须在 test.conf.j2 和 example.conf.j2 中使用{% extends 'nginx.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 和其他模板

【问题讨论】:

    标签: ansible ansible-2.x ansible-template


    【解决方案1】:

    问:“下一步是什么?我必须使用 {% extends 'nginx.conf.j2' %} ...?”

    答:是的。需要extends。例如

        - template:
            src: test.j2
            dest: test
    

    使用模板

        shell> cat main.j2
        value1 = 123
        {% block test %}
        value = default value in main.j2
        {% endblock %}
        value3 = 789
    
        shell> cat test.j2 
        {% extends 'main.j2' %}
        {% block test %}
        value = custom value in test.j2
        {% endblock %}
    

    给予

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

    问:“我的 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文件。见template


    FWIW。可以使用blockinfile 并循环模板的lookup。例如

        - 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
    

    使用模板

        shell> 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
    
        shell> cat test.conf.j2
        value_test = custom value in test.conf.j2
    
        shell> cat example.conf.j2
        value_example = custom value in example.conf.j2
    

        shell> 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多