Как автоматически установить роли Ansible Galaxy, используя Vagrant?

Используя только одну пьесу, Ansible не сможет автоматически установить зависимые роли. По крайней мере, согласно этой теме.

Но у меня есть дополнительное "преимущество" использования локального провайдера Vagrant и Vagrant Ansible. Какие уловки я могу применить?

1 ответ

Решение

Обновление 2018-11-22!

Учитывая эволюцию программного обеспечения, я не могу гарантировать, что все "старые вещи / ответы", приведенные ниже, все еще законны и не подожгут вашу машину. Тем не менее, я поддерживаю Vagrantfile на GitHub, который автоматически устанавливает роли Ansible Galaxy, и этот парень должен рассматриваться как единственная и святая истина (прокрутите немного вниз в файле). Если файл GitHub-guy-file не работает для вас, добавьте ошибку на трекере GitHub, и я позабочусь об этом.

Старый материал / ответ..

Что-то вроде этого (Vagrantfile):

config.vm.provision 'ansible', run: 'always', type: :ansible_local do |ansible|
  ansible.galaxy_role_file = 'requirements.yml'
  ansible.playbook = 'playbook.yml'
end

Содержание requirements.yml:

---
- src: mongrelion.docker

Пожалуйста, обратите внимание, как моя 1 роль указана в отдельном файле, что полностью излишне. Я хотел бы указать роль в Vagrantfile, не добавляя еще один сценарий оболочки, который устанавливает Ansible до того, как Vagrant получит шанс, а затем запускает команду установки galaxy. Я нахожу удобным позволить Vagrant установить Ansible, и это просто плохо для каждого дополнительного "скрипта", который я добавляю, когда Ansible должен быть провайдером, lol.

Для записей ansible-galaxy install не требует указания файла роли; достаточно имени роли в качестве аргумента команды, и в этом случае роль будет загружена ( документы).

Я около полдня пытался взломать и урезать различные варианты Vagrant, такие как galaxy_command но каждая новая хитрость вызывала новую проблему, которая была жесткой остановкой для Вагранта (звучит знакомо? хахаха).

Если вы найдете способ установить встроенную роль, не зависящую от еще одного файла или скрипта оболочки nitehacked в Vagrantfile, пожалуйста, привет мне =)

Как изменить место хранения файлов роли Ansible?

По умолчанию Ansible Galaxy загружает файлы ролей в подкаталог проекта: ./roles/, Ansible автоматически ищет роли в этом подкаталоге при анализе файла playbook.

Я считаю, что это местоположение не очень удобно, учитывая мою личную цель - содержать папки проекта в чистоте и добавлять в мой репозиторий как можно меньше мусора. К счастью, можно изменить путь загрузки Galaxy, установив galaxy_roles_path в другое место, которое Ansible также использует для поиска ролей в: /etc/ansible/roles/,

Если бы это было так просто.

[По крайней мере, на моем компьютере:] Когда Vagrant устанавливает Ansible, папка создается с правами на запись только для пользователя root. То есть когда ansible-galaxy install запустить через 1 минуту и ​​загрузить роль, все происходит сбой из-за недостаточных разрешений. Или, иначе говоря, Ansible не может положить дерьмо в свою "домашнюю папку". Это довольно забавно на самом деле.

Исправление заключается в том, чтобы ввести некоторые chmod Волшебство в папку, прежде чем Ansible удается испортить для себя:

config.vm.provision 'preemptively give others write access to /etc/ansible/roles', type: :shell, inline: <<~'EOM'
  mkdir /etc/ansible/roles -p
  chmod o+w /etc/ansible/roles
EOM

config.vm.provision 'ansible', run: 'always', type: :ansible_local do |ansible|
  ansible.galaxy_role_file = 'requirements.yml'
  ansible.galaxy_roles_path = '/etc/ansible/roles'
  ansible.playbook = 'playbook.yml'
end

Как мне остановить постоянную переустановку роли?

Я считаю хорошей практикой позволять провайдеру Ansible всегда работать. Так что он может делать свое дело, так сказать. Вывод терминала показывает, что vagrant up загружает и устанавливает роль при каждом запуске. Это раздражает меня до чертиков.

galaxy_command по умолчанию использует --force флаг - почему? Не имеют ни малейшего представления о. Но удаление этого решает проблему. Теперь вместо этого мы получаем предупреждение:

[ПРЕДУПРЕЖДЕНИЕ]: - mongrelion.docker (master) уже установлен - используйте --force, чтобы изменить версию на неопределенную

Утомительный. Я должен быть польщен, а не предупрежден;) Бродяга добавил --force флаг для подавления этого предупреждения? Случайным образом я нашел другое решение. Добавьте явный тег версии ( docs) к определению роли и вуаля, вместо этого предупреждение заменяется чем-то симпатичным:

- mongrelion.docker (6a4fe8fc18550bfff8eeecd89888cf817cdf4bfc) уже установлен, пропуская.

Если вы по-прежнему получаете предупреждающее сообщение, значит, у вас уже была установлена ​​другая версия, прежде чем явно добавить тег версии. Итак, теперь вы должны использовать --force хотя бы один раз принудительно обновить или вручную удалить старое (ansible-galaxy remove stupid.role).

Сказав все вышесказанное, это последнее содержание, которое я закончил..

Vagrantfile:
config.vm.provision 'preemptively give others write access to /etc/ansible/roles', type: :shell, inline: <<~'EOM'
  sudo mkdir /etc/ansible/roles -p
  sudo chmod o+w /etc/ansible/roles
EOM

config.vm.provision 'ansible', run: 'always', type: :ansible_local do |ansible|
  ansible.galaxy_role_file = 'requirements.yml'
  ansible.galaxy_roles_path = '/etc/ansible/roles'
  ansible.galaxy_command = 'ansible-galaxy install --role-file=%{role_file} --roles-path=%{roles_path}'
  ansible.playbook = 'playbook.yml'
end
requirements.yml:

---
- src: mongrelion.docker
версия: 6a4fe8fc18550bfff8eeecd89888cf817cdf4bfc

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