Я не могу вычислить переменные и надеюсь, что какой-нибудь добрый человек укажет мне правильное направление.
У меня есть три файла:
group_vars/all
---
env2: server
hosts
[all:vars]
env=development
[webservers]
138.78.334.247
site.yml
---
- name: Provision an {{ env }} {{ env2 }} db server
hosts: all
become: yes
become_user: root
vars:
- update_apt_cache: yes
Когда я запускаю команду:
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 }}] ***
И ваш пример похож на последний:
Вы пытаетесь напечатать групповые переменные в названии игры, то есть на уровне, на котором групповые переменные еще не определены.