Назад | Перейти на главную страницу

Как прочитать переменные Ansible из файлов инвентаризации?

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

У меня есть три файла:

Когда я запускаю команду:

ansible-playbook -i development site.yml

Мои результаты показывают:

PLAY [Provision an {{ env }} {{ env2 }} db server] *****************************  

Вместо замены файла vars.

Я также пробовал позвонить site.yml из другого файла YAML, используя include:, но это тоже не сработало.

Кажется, я не могу понять, что я здесь делаю не так, потому что это кажется простым из документации.

Я использую Ansible 2.2.1.


Вышеупомянутое - это упрощенный пример того, что я пытаюсь выполнить, а именно:

---    
- name: Provision a {{ application_name }} web server
  hosts: all
  become: yes
  become_user: root
  remote_user: "{{ server_user }}"
  vars:
    - update_apt_cache: yes
  vars_files:
    - env_vars/{{ env }}.yml

   roles:
    - base
    - db
    - mysql
    - web
    - nginx

Это довольно сложно, поскольку здесь задействовано несколько аспектов. Но это легко проверить методом проб и ошибок.

Ответ

Вы можете использовать переменные в именах игр и задач, если все переменные, используемые в имени, определены и доступны на определенном уровне.

В вашем примере как env и env2 являются групповыми переменными, и они не заменяются на уровне игры.

При печати имени воспроизведения в выходном журнале Ansible еще не знает, на каких хостах он будет работать, поэтому он также не знает, какие значения определены для этих хостов (и значение может отличаться в зависимости от хоста).

Однако на уровне задачи ценности определены единогласно.

Рассматривать:

---
- name: Here variables do not work {{ env }} {{ env2 }}
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Here variables work {{ env }} {{ env2 }}
      debug:

Изготовим:

PLAY [Here variables do not work {{ env }} {{ env2 }}] *************************

TASK [Here variables work development server] **********************************
ok: [localhost] => {
    "msg": "Hello world!"
}

Что касается последнего примера (Provision a {{ application_name }} web server):

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

vars_files:
  - env_vars/base.yml

Значение application_name определено в env_vars/base.yml таким образом, единогласно отображается в названии пьесы.

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


Дополнительный улов

Если вы добавили переменную, которая не определена в имя задачи из приведенного выше примера, которая работала иначе, например:

- name: Here variables work {{ env }} {{ env2 }} {{ unknown }}
  debug:

Вы получите:

TASK [These variables will not work {{ env }} {{ env2 }} {{ unknown }}] ********

Даже правильно определенные переменные не заменялись.


Точно так же пытаясь использовать факт на уровне хоста, например ansible_hostname также не удастся:

tasks:
  - name: These variables will not work {{ env }} {{ env2 }} {{ ansible_hostname }}
    debug:

Вы получите:

TASK [These variables will not work {{ env }} {{ env2 }} {{ ansible_hostname }}] ***

И ваш пример похож на последний:

Вы пытаетесь напечатать групповые переменные в названии игры, то есть на уровне, на котором групповые переменные еще не определены.