Использование предложения jinja if в шаблонном yaml ansible (через поиск по шаблону) - PullRequest
0 голосов
/ 05 мая 2020

Я использовал модуль ansible k8s с определением Dynami c, где я называю его

- name: install some tool
  k8s:
    state: present
    definition: "{{ lookup('template', '{{item}}') }}"
    context: "{{ cluster_name}}"
  loop:
    - "tool_template.yaml"

И в шаблоне я хочу иметь условный блок с использованием переменной из ansible role (is_major в данном случае)

metadata:
      labels:
        app: tool_name

      {% if is_major | bool %}
      annotations:
        ad.datadoghq.com/container.check_names: '["openmetrics"]'
        ad.datadoghq.com/container.init_configs: '[{}]'
        ad.datadoghq.com/container.instances: |
          [{
          "prometheus_url": "http://pathto:port/,
          "namespace": "myapp",
          "metrics": ["somemetric*"]
          }]
      {% endif %}

К сожалению, это взрывается с исключением ansible, и в документации невозможно найти подсказку, как это сделать (с недавними документами на минимум) может быть тем, что я, возможно, создаю шаблон yaml. поэтому ищите решение / обходной путь

ansible версия 2.9

EDIT: полная ошибка (с vvv)

The full traceback is:
    Traceback (most recent call last):
File "/home/username/.ansible/tmp/ansible-tmp-1588716858.967364-29993-207569799864998/AnsiballZ_k8s.py", line 102, in <module>
    _ansiballz_main()
    File "/home/username/.ansible/tmp/ansible-tmp-1588716858.967364-29993-207569799864998/AnsiballZ_k8s.py", line 94, in _ansiballz_main
    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
    File "/home/username/.ansible/tmp/ansible-tmp-1588716858.967364-29993-207569799864998/AnsiballZ_k8s.py", line 40, in invoke_module
    runpy.run_module(mod_name='ansible.modules.clustering.k8s.k8s', init_globals=None, run_name='__main__', alter_sys=True)
    File "/home/username/.pyenv/versions/3.6.6/lib/python3.6/runpy.py", line 205, in run_module
    return _run_module_code(code, init_globals, run_name, mod_spec)
    File "/home/username/.pyenv/versions/3.6.6/lib/python3.6/runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
    File "/home/username/.pyenv/versions/3.6.6/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
    File "/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/modules/clustering/k8s/k8s.py", line 279, in <module>
    File "/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/modules/clustering/k8s/k8s.py", line 275, in main
    File "/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/module_utils/k8s/raw.py", line 145, in __init__
    File "/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/module_utils/k8s/raw.py", line 145, in <listcomp>
    File "/home/username/.local/lib/python3.6/site-packages/yaml/__init__.py", line 130, in load_all
    yield loader.get_data()
    File "/home/username/.local/lib/python3.6/site-packages/yaml/constructor.py", line 37, in get_data
    return self.construct_document(self.get_node())
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 27, in get_node
    return self.compose_document()
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 55, in compose_document
    node = self.compose_node(None, None)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 133, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 133, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 133, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
    File "/home/username/.local/lib/python3.6/site-packages/yaml/composer.py", line 127, in compose_mapping_node
    while not self.check_event(MappingEndEvent):
    File "/home/username/.local/lib/python3.6/site-packages/yaml/parser.py", line 98, in check_event
    self.current_event = self.state()
    File "/home/username/.local/lib/python3.6/site-packages/yaml/parser.py", line 428, in parse_block_mapping_key
    if self.check_token(KeyToken):
    File "/home/username/.local/lib/python3.6/site-packages/yaml/scanner.py", line 116, in check_token
    self.fetch_more_tokens()
    File "/home/username/.local/lib/python3.6/site-packages/yaml/scanner.py", line 223, in fetch_more_tokens
    return self.fetch_value()
    File "/home/username/.local/lib/python3.6/site-packages/yaml/scanner.py", line 579, in fetch_value
    self.get_mark())
    yaml.scanner.ScannerError: mapping values are not allowed here
    in "<unicode string>", line 18, column 24:
    annotations:
    ^
    failed: [localhost] (item=aks/monitor/datadog/datadog-agent-daemonset.yaml) => {
        "ansible_loop_var": "item",
        "changed": false,
        "item": "aks/monitor/datadog/datadog-agent-daemonset.yaml",
        "module_stderr": "Traceback (most recent call last):\n  File \"/home/username/.ansible/tmp/ansible-tmp-1588716858.967364-29993-207569799864998/AnsiballZ_k8s.py\", line 102, in <module>\n    _ansiballz_main()\n  File \"/home/username/.ansible/tmp/ansible-tmp-1588716858.967364-29993-207569799864998/AnsiballZ_k8s.py\", line 94, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/home/username/.ansible/tmp/ansible-tmp-1588716858.967364-29993-207569799864998/AnsiballZ_k8s.py\", line 40, in invoke_module\n    runpy.run_module(mod_name='ansible.modules.clustering.k8s.k8s', init_globals=None, run_name='__main__', alter_sys=True)\n  File \"/home/username/.pyenv/versions/3.6.6/lib/python3.6/runpy.py\", line 205, in run_module\n    return _run_module_code(code, init_globals, run_name, mod_spec)\n  File \"/home/username/.pyenv/versions/3.6.6/lib/python3.6/runpy.py\", line 96, in _run_module_code\n    mod_name, mod_spec, pkg_name, script_name)\n  File \"/home/username/.pyenv/versions/3.6.6/lib/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/modules/clustering/k8s/k8s.py\", line 279, in <module>\n  File \"/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/modules/clustering/k8s/k8s.py\", line 275, in main\n  File \"/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/module_utils/k8s/raw.py\", line 145, in __init__\n  File \"/tmp/ansible_k8s_payload_d7uua9ug/ansible_k8s_payload.zip/ansible/module_utils/k8s/raw.py\", line 145, in <listcomp>\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/__init__.py\", line 130, in load_all\n    yield loader.get_data()\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/constructor.py\", line 37, in get_data\n    return self.construct_document(self.get_node())\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 27, in get_node\n    return self.compose_document()\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 55, in compose_document\n    node = self.compose_node(None, None)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 84, in compose_node\n    node = self.compose_mapping_node(anchor)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 133, in compose_mapping_node\n    item_value = self.compose_node(node, item_key)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 84, in compose_node\n    node = self.compose_mapping_node(anchor)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 133, in compose_mapping_node\n    item_value = self.compose_node(node, item_key)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 84, in compose_node\n    node = self.compose_mapping_node(anchor)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 133, in compose_mapping_node\n    item_value = self.compose_node(node, item_key)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 84, in compose_node\n    node = self.compose_mapping_node(anchor)\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/composer.py\", line 127, in compose_mapping_node\n    while not self.check_event(MappingEndEvent):\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/parser.py\", line 98, in check_event\n    self.current_event = self.state()\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/parser.py\", line 428, in parse_block_mapping_key\n    if self.check_token(KeyToken):\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/scanner.py\", line 116, in check_token\n    self.fetch_more_tokens()\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/scanner.py\", line 223, in fetch_more_tokens\n    return self.fetch_value()\n  File \"/home/username/.local/lib/python3.6/site-packages/yaml/scanner.py\", line 579, in fetch_value\n    self.get_mark())\nyaml.scanner.ScannerError: mapping values are not allowed here\n  in \"<unicode string>\", line 18, column 24:\n                annotations:\n                           ^\n",
        "module_stdout": "",
        "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
        "rc": 1
    }

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вероятно, вам следует удалить отступ в условиях шаблона, пробелы перед условиями добавляются к пробелам следующей строки, потому что новая строка после тега условия удаляется, что приводит к отображению anotations иметь двойной отступ, чего не ожидалось.

Текущие результаты вашего шаблона:

metadata:
  labels:
    app: tool_name

      annotations:
    ad.datadoghq.com/container.check_names: '["openmetrics"]'
    ad.datadoghq.com/container.init_configs: '[{}]'
    ad.datadoghq.com/container.instances: |
      [{
      "prometheus_url": "http://pathto:port/,
      "namespace": "myapp",
      "metrics": ["somemetric*"]
      }]

Вот как должен выглядеть шаблон:

metadata:
  labels:
    app: tool_name

{% if is_major | bool %}
  annotations:
    ad.datadoghq.com/container.check_names: '["openmetrics"]'
    ad.datadoghq.com/container.init_configs: '[{}]'
    ad.datadoghq.com/container.instances: |
      [{
      "prometheus_url": "http://pathto:port/,
      "namespace": "myapp",
      "metrics": ["somemetric*"]
      }]
{% endif %}

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

Подробнее о пробелах в Jinja2: https://jinja.palletsprojects.com/en/2.11.x/templates/#whitespace -control .

Вы также можете больше контролировать поведение, играя с флагами trim_blocks и lstrip_blocks.

0 голосов
/ 05 мая 2020

Вы не можете поместить {{}} внутри {{}}, поэтому попробуйте удалить лишний блок:

- name: install some tool
  k8s:
    state: present
    definition: "{{ lookup('template', item) }}"
    context: "{{ cluster_name}}"
  with_items:
    - "tool_template.yaml"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...