Могу ли я использовать подстановку переменных с ansible-galaxy и needs.yml?
У нас есть частные репозитории git для ряда Ansible ролей. Хосты репо варьируются от сайта к сайту, например:
- Сайт1 использует
https://gitforsite1.ourdomain.com
- Site2 использует
https://gitforsite2.ourdomain.com
То, что я хочу, это иметь один requirements.yml
файл и подставьте правильный git-репо. Один из способов, которым я мог бы сделать это, - это чтобы bash-скрипт установил переменную окружения:
#!/bin/bash
...
if [ "$1" = "site1" ]; then
export REPO_ROOT="https://gitforsite1.ourdomain.com"
fi
if [ "$1" = "site2" ]; then
export REPO_ROOT="https://gitforsite2.ourdomain.com"
fi
... error checking if the value is not site1 or site2 ...
# Then install the roles
ansible-galaxy install -f -r config/requirements.yml -p roles
а затем подставить это значение в requirements.yml
:
---
- src: {{ lookup('env', 'REPO_ROOT') }}/role1.git
name: role1
- src: {{ lookup('env', 'REPO_ROOT') }}/role.git
name: role2
Этот подход дает: ERROR! Unable to load data from the requirements file
предполагая, что структура файла неверна. (Может случиться так, что подход работает, и я неправильно понял синтаксис.)
Любой подход, который позволяет мне установить переменную (окружение, командная строка, что угодно), подойдет. Кроме того, если это не поддерживается, нужно ли переписать requirements.yml
файл во время выполнения, возможно, используя sed
?
РЕДАКТИРОВАТЬ 1: Добавлено ansible-galaxy
в приведенной выше выдержке из сценария bash, чтобы показать, как requirements.yml
файл используется. Я думаю, что это проблема ansible-galaxy
не расширяет переменные подстановки, будь то в group_vars/all
или окружающая среда. Использование Ansible версии 2.3.1.0 с Python 2.7.10.
РЕДАКТИРОВАТЬ 2: Обнаружено в документах есть server
возможность указать на другой экземпляр Galaxy, в ansible.cfg
, вот так:
[galaxy]
server=https://gitforsite1.ourdomain.com
Galaxy использует этот параметр, но это должно быть полноценное веб-приложение Galaxy, потому что оно вызывает https://gitforsite1.ourdomain.com/api
, Так что это мне тоже не поможет.
2 ответа
Когда они начинаются с {
, вы должны заключить в кавычки значения в сопоставлениях, связанных с источником. Если нет, то анализатор yaml попытается проанализировать это значение как отображение в стиле потока вместо скаляра:
- src: "{{ lookup('env', 'REPO_ROOT') }}/role1.git"
name: role1
Так как у вас есть одинарные кавычки в скаляре и нет двойных кавычек, ни обратной косой черты (\
), Я использовал двойные кавычки вокруг скаляра. Лучше использовать одинарные кавычки, если в скаляре нет одинарных кавычек или есть обратные слеши. Если у вас есть оба типа кавычек, используйте одинарные кавычки и удвойте все одинарные кавычки в скаляре. Следующее будет загружаться так же, как указано выше:
- src: '{{ lookup(''env'', ''REPO_ROOT'') }}/role1.git'
name: role1
Что делать, если вы сделали это так:
#!/bin/bash
...
if [ "$1" = "site1" ]; then
export REPO_ROOT="https://gitforsite1.ourdomain.com"
fi
if [ "$1" = "site2" ]; then
export REPO_ROOT="https://gitforsite2.ourdomain.com"
fi
... error checking if the value is not site1 or site2 ...
# Then install the roles
ansible-galaxy install -f -r config/requirements.yml -p roles -s ${REPO_ROOT}
и затем подставьте это значение в needs.yml:
---
- src: role1.git
name: role1
- src: role.git
name: role2
У меня есть обходной путь. Если вы не возражаете против времени выполнения, обратитесь к:
- name: geerlingguy.docker
- name: geerlingguy.docker
src: https://my-private-server-1/path/is/not/important/docker.tar.gz
- name: geerlingguy.docker
src: https://my-private-server-2/path/is/not/important/docker.tar.gz
и выполните ansible-galaxy, например:
$ ansible-galaxy install --ignore-errors -r requirements.git-cache.yml
В этом примере достигается установка следующей роли, если у нас отключится Интернет.
После установки одной и той же роли установка той же роли будет пропущена.
Конечно, вы можете изменить порядок ролей по своему желанию.