Мне нужно создать файл с помощью шаблона jinja, но возникают некоторые проблемы.

Моя переменная

my:
  acl:
        - name: test
          allow:
            - 0.0.0.0
          deny:
            - 1.1.1.1
        - name: china
          allow:
            - 1.2.3.4
          deny:
            - 10.10.10.10

Моя задача:

- name: Create acl file
  template:
    force: yes
    src: acl.conf.j2
    dest: "/etc/nginx/conf.d/{{ item.name }}.conf"
  become: yes
  with_items:
    - "{{ my.acl }}"

Мой шаблон

{% for allow in my.acl %}
allow {{allow.allow}};
{% endfor %}
{% for deny in my.acl %}
deny {{deny.deny}};
{% endfor %}

Результат china.conf

allow ['0.0.0.0'];
allow ['1.2.3.4'];
deny ['1.1.1.1'];
deny ['10.10.10.10'];

Результат test.conf

allow ['0.0.0.0'];
allow ['1.2.3.4'];
deny ['1.1.1.1'];
deny ['10.10.10.10'];

Мне нужны в файле china только IP-адреса, которые определены в объекте china без ['']

Как я могу это сделать?

3
sokolata 5 Дек 2020 в 23:56

2 ответа

Лучший ответ

Исправить шаблон

{% for allow in item.allow %}
allow {{ allow }};
{% endfor %}
{% for deny in item.deny %}
deny {{ deny }};
{% endfor %}
1
Vladimir Botka 5 Дек 2020 в 22:12

Добавьте if и распечатайте первый объект в списках allow и deny:

{% for allow in my.acl %}
  {% if allow.name == 'china' %}
    allow {{ allow.allow[0] }};
  {% endif %}
{% endfor %}
{% for deny in my.acl %}
  {% if allow.name == 'china' %}
    deny {{ deny.deny[0] }};
  {% endif %}
{% endfor %}

Если в списках разрешений и запретов будет более одного элемента, используйте это:

{% for allow in my.acl %}
  {% if allow.name == 'china' %}
    {% for ip in allow.allow %}
      allow {{ ip }};
    {% endfor %}
  {% endif %}
{% endfor %}
{% for deny in my.acl %}
  {% if deny.name == 'china' %}
    {% for ip in deny.deny %}
      deny {{ ip }};
    {% endfor %}
  {% endif %}
{% endfor %}
-1
gary lopez 5 Дек 2020 в 21:17