LINUX.ORG.RU
решено ФорумAdmin

Как сделать вычислимую переменную в /group_vars/all.yml в зависимости от os.path.isdir() ?

 ,


0

1

В jinja - шаблонах нельзя использовать привычные методы стандартных Python-модулей, например os.path.isdir(...). Вместо этого предлагается выполнить задачу с модулем stat, в ней вычислить значение, а потом его использовать:

https://stackoverflow.com/questions/43522337/defining-os-path-in-ansible-jinj...

А как тогда установить значение переменной в файле /group_vars/all.yml в зависимости от результата работы stat? Ведь синтаксис этого файла не предполагает исполнение задачи, и в нем только устанавливаются значения переменных?



Перемещено hobbit из general

★★★★★

Последнее исправление: Xintrea (всего исправлений: 4)

Ответ на: комментарий от Xintrea

а зачем его вызывать в vars файле? ты же можешь использовать сгенерированное значение вместо попытки расчета запихнуть его в jinja. Посчитай его ПЕРЕД использованием шаблона и сделай set_fact, и запускай свою jinja, и там уже обмазывай if’ами в зависимости от значения.

Demacr ★★
()
Ответ на: комментарий от Demacr

Я тебя не понимаю. Файл /group_vars/all.yml подключается автоматически Ансиблой. Как вмешаться в эту последовательность и запихнуть выполнение плейбука перед считыванием /group_vars/all.yml ?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от George

Одну и ту же переменную можно определить в куче мест, так что просто сделай set_fact до таска

Это должна быть «системная переменная» которая доступна в куче тасков различных плейбуков. Я же не буду в каждый плейбук доблировать код.

Xintrea ★★★★★
() автор топика

в ансибле можно писать свои фильтры для jinja.

Например так

<playbooks-dir>/filter_plugins/core.py

def check_is_dir(path):
    from os.path import isdir
    return isdir(path)


class FilterModule(object):
    def filters(self):
        return {
            'check_is_dir': check_is_dir
        }

<playbooks-dir>/group_vars/all.yml

dir_OK: "/tmp"
var_OK: "{{ 'OK' if dir_OK|check_is_dir else 'NOK '}}"

dir_NOK: "/tmp_"
var_NOK: "{{ 'OK' if dir_NOK|check_is_dir else 'NOK'}}"

тестовый плейбук

- hosts: my_pc
  tasks:
    - name: "OK test"
      debug:
        var: var_OK

    - name: "NOK test"
      debug:
        var: var_NOK

и выхлоп

TASK [OK test]
ok: [localhost] => {
    "var_OK": "OK"
}

TASK [NOK test]
ok: [localhost] => {
    "var_NOK": "NOK"
}

CaHbl4
()
Ответ на: комментарий от Xintrea

Ещё можно jinja шаблоны и в переменных задавать.Например:

dhcpd_groups_netbox_hosts_kvm_el8_fact: >
  [
    {%- for dhcp_hosts in ['kvm_el8'] -%}
    {%- for host in groups[dhcp_hosts] -%}
      {%- for interface in hostvars[host]['interfaces'] -%}
      {%- if (interface.untagged_vlan != None and
        interface.untagged_vlan.vid in [11, 22, 24]) and
        interface.enabled == true -%}
      {%- if (interface.mac_address is defined and interface.mac_address |
        ansible.utils.hwaddr()) and (interface.ip_addresses[0].address is
        defined and interface.ip_addresses[0].address |
        ansible.utils.ipaddr()) -%}
      {"name": "{{ host }}",
      "host_name": "{{ host }}",
      "fixed_address": "{{ interface.ip_addresses[0].address |
        ansible.utils.ipaddr('address') }}",
      "mac_address": "{{ interface.mac_address |
        ansible.utils.hwaddr('linux') }}",
      },
      {%- endif -%}
      {%- endif -%}
      {%- endfor -%}
      {%- endfor -%}
    {%- endfor -%}
  ]```
FireFighter ★★★
()