Как я могу написать переменные внутри файла задач в ansible

У меня есть это play.yml

---
- hosts: 127.0.0.1
  connection: local
  sudo: false

  tasks:
     - include: apache.yml

Мой Apache выглядит так:

vars:
    url: czxcxz

- name: Download apache
  shell: wget {{url}} 

Это дает мне ошибку.

Если я уберу vars, то это сработает. Но я хочу включить переменные внутри задач, чтобы я мог хранить разные переменные для разных задач отдельно.


person user1994660    schedule 20.03.2014    source источник


Ответы (5)


ПРИМЕЧАНИЕ. Использование set_fact, как описано ниже, устанавливает факт/переменную на удаленных серверах, на которых выполняется задача. Затем этот факт/переменная будет сохраняться в последующих задачах на протяжении всей продолжительности вашей пьесы.

Кроме того, эти факты неизменны (в течение всего времени действия пьесы) и не могут быть изменены после установки.


ОРИГИНАЛЬНЫЙ ОТВЕТ

Используйте set_fact перед вашей задачей, чтобы установить факты, которые кажутся взаимозаменяемыми с переменными:

- name: Set Apache URL
  set_fact:
    apache_url: 'http://example.com/apache'

- name: Download Apache
  shell: wget {{ apache_url }}

Официальное слово см. на http://docs.ansible.com/set_fact_module.html.

person dodgio    schedule 16.01.2015
comment
Это кажется лучшим решением, поскольку вы можете использовать факт как переменную. - person douglaslps; 13.02.2015
comment
Обратите внимание на это тонкое различие по сравнению с переменными: Этот модуль позволяет устанавливать новые переменные. Переменные устанавливаются для каждого хоста точно так же, как и факты, обнаруженные модулем настройки. Эти переменные сохранятся между играми. - person rrauenza; 07.10.2015
comment
Боковое примечание: кажется, что вы не можете изменить переменную на месте, используя set_fact... поэтому, если имя уже занято переменной, оно не изменит это... что может привести к ошибкам при установке переменной в то же имя на более высоком уровне playbook. Поэтому убедитесь, что вы не будете этого делать (например, использовать потенциально уникальное имя, а не «предмет»). - person masu; 30.06.2016
comment
Обратите внимание на вашу заметку... Also, these facts are immutable (for the duration of the playbook), and cannot be changed once set. -- Это не совсем так. Вы можете перезаписать факт, созданный с помощью set_fact в более ранней задаче, вы просто не можете перезаписать набор переменных каким-либо другим способом... Например, если вы перебираете набор задач, и в начале каждой итерации цикла вы используете set_fact: loop_item='{{ item }}', затем используете debug: msg='{{ loop_item }}', вы увидите факт изменения с каждой итерацией цикла. - person Jack_Hu; 28.03.2019

Я знаю, это было давно, но, поскольку самый простой ответ еще не был опубликован, я сделаю это для другого пользователя, который может пройти мимо.

Просто переместите var внутри блока «name»:

- name: Download apache
  vars:
    url: czxcxz
  shell: wget {{url}} 
person appleitung    schedule 07.03.2019

Определения переменных предназначены для использования в задачах. Но если вы хотите включить их в задачи, вероятно, используйте директиву register. Как это:

- name: Define variable in task.
  shell: echo "http://www.my.url.com"
  register: url

- name: Download apache
  shell: wget {{ item }}
  with_items: url.stdout

Вы также можете использовать роли как способ разделения задач в зависимости от разных ролей роли. Таким образом, вы можете иметь отдельные переменные для каждой из ваших ролей. Например, у вас может быть переменная url для apache1 и отдельная переменная url для роли apache2.

person Rico    schedule 22.03.2014
comment
Я думал, что регистр работает только с выводом команды? Как я могу сделать статическую переменную в роли roles/<role>/tasks/main.yml? - person ThorSummoner; 06.03.2015
comment
@ThorSummoner, вы имеете в виду, что это обычная переменная? docs.ansible.com/ и, может быть, это? docs.ansible.com/playbooks_roles.html#role-default-variables - person Rico; 11.03.2015
comment
Это решение является полным излишеством. Вы отправляете значение var через ssh на удаленный хост, а затем получаете его обратно, чтобы использовать его локально на узле управления!! - person Samha'; 05.11.2019

В вашем примере apache.yml - это список задач, а не playbook

В зависимости от желаемой архитектуры вы можете сделать одно из:

  1. Преобразуйте apache.yml в роль. Затем определите задачи в roles/apache/tasks/mail.yml и переменные в roles/apache/defaults/mail.yml (vars в defaults можно переопределить при применении роли)

  2. Установить переменные в плейбуке play.yml

play.yml

---
- hosts: 127.0.0.1
  connection: local
  sudo: false

  vars:
    url: czxcxz

  tasks:
     - include: apache.yml

apache.yml

- name: Download apache
  shell: wget {{url}} 
person mmv-ru    schedule 22.03.2019

Всякий раз, когда у вас есть модуль, за которым следует переменная в той же строке в ansible, синтаксический анализатор будет рассматривать ссылочную переменную как начало встроенного словаря. Например:

- name: some example
  command: {{ myapp }} -a foo

По умолчанию здесь первая часть {{ myapp }} -a foo анализируется как словарь, а не как строка, и вы получите сообщение об ошибке.

Таким образом, вы должны процитировать аргумент следующим образом:

- name: some example
  command: "{{ myapp }} -a foo"
person Dwayne Mcnab    schedule 08.11.2016
comment
Это правда, но это не отвечает на вопрос. - person james.garriss; 08.11.2019