it-swarm.com.ru

Ansible: интерполяция переменных в имени задачи

Я не могу заставить этот, казалось бы, простой пример работать в Ansible 1.8.3. Переменная интерполяция не запускает имя задачи. Все примеры я видел, кажется, предполагают, что это должно работать. Учитывая, что переменная определена в разделе vars, я ожидал, что имя задачи напечатает значение переменной. Почему это не работает?

Кажется, даже пример из Ansible документации не печатает значение переменной.

---
- hosts: 127.0.0.1
  gather_facts: no
  vars:
    vhost: "foo"
  tasks:
    - name: create a virtual Host file for {{ vhost }}
      debug: msg="{{ vhost }}"

Это приводит к следующему выводу:

PLAY [127.0.0.1]     
************************************************************** 

TASK: [create a virtual Host file for {{ vhost }}] 
**************************** 
ok: [127.0.0.1] => {
   "msg": "foo"
}

PLAY RECAP 
******************************************************************** 
127.0.0.1                  : ok=1    changed=0    unreachable=0    failed=0   

Update Это работает с 1.7.2, но не работает с 1.8.3. Так что это либо ошибка, либо особенность.

13
calvinkrishy

Переменные не разрешаются внутри name. Только внутри реальных задач/условий и т.д. Заполнители будут решены. Я предполагаю, что это по замыслу. Представьте, что у вас есть цикл with_items и вы используете {{ item }} в name. Задачи name будут напечатаны только один раз, но {{ item }} будет меняться в каждой итерации.

Я вижу примеры, даже те, что в документе, на который вы ссылаетесь, используют переменные в name. Но это не значит, что результат будет таким, как вы ожидали. Документы управляются сообществом. Может быть, кто-то просто поместил эту строку там без тестирования - или, возможно, она работала так же, как в предыдущей версии Ansible, и тогда документы не обновлялись. (Я использую Ansible только около года). Но даже если это не работает так, как нам хотелось бы, я все еще использую переменные в своих name, просто чтобы показать, что задача основана на динамических параметрах. Может быть, примеры были написаны с тем же намерением.

Интересное наблюдение, которое я недавно сделал (Ansible 1.9.4), заключается в том, что значения по умолчанию записаны в имени задачи.

- name: create a virtual Host file for {{ vhost | default("foo") }}

При выполнении Ansible отображает название задачи в виде:

ЗАДАЧА: [создать файл виртуального хоста для foo] 

Таким образом, вы можете избежать уродливых имен задач в выводе.

17
udondan

Вы должны заключить строку в кавычки.

tasks:
    - name: "create a virtual Host file for {{ vhost }}"
      debug: msg="{{ vhost }}"

Из ответная документация :

Синтаксис YAML требует, чтобы при запуске значения с {{foo}} вы указывали всю строку в кавычках, так как он хочет быть уверен, что вы не пытаетесь запустить словарь YAML. Это описано на странице синтаксис YAML .

1
J.A. Simmons V

Объяснение

Будет ли переменная интерполирована, зависит от того, где она была объявлена.

Представьте, что у вас есть два хоста: A и B.

  • Если переменная foo имеет только значения для каждого хоста, когда Ansible запускает воспроизведение, она не может решить, какое значение использовать.
  • С другой стороны, если он имеет значение global (глобальное в смысле инвариантности хоста), не возникает путаницы, какое значение использовать.

Источник: https://github.com/ansible/ansible/issues/3103#issuecomment-18835432

Руки на playbook

  • ansible_user - переменная инвентаря
  • greeting является инвариантной переменной
- name: Test variable substitution in names
  hosts: localhost
  connection: local
  vars:
    greeting: Hello
  tasks:
    - name: Sorry {{ ansible_user }}
      debug:
        msg: this won't work
    - name: You say '{{ greeting }}'
      debug:
        var: ansible_user
0
MrMeszaros