Могу ли я использовать подстановку переменных с 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

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

После установки одной и той же роли установка той же роли будет пропущена.

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

Другие вопросы по тегам