如何使用 Vagrant 自动安装 Ansible Galaxy 角色?

How to automatically install Ansible Galaxy roles, using Vagrant?

只使用一个 playbook,则无法让 Ansible 自动安装依赖角色。至少按照这个SO thread.

但是,我添加了 "advantage" 使用 Vagrant 和 Vagrant 的 Ansible local provisioner。我可以应用任何技巧吗?

2018-11-22更新!

鉴于软件的发展,我不能保证下面的所有 "old stuff/answer" 仍然合法并且不会让您的机器着火,哈哈。但是,我确实维护了一个 Vagrantfile on GitHub,它确实会自动安装 Ansible Galaxy 角色,这个人应该被视为唯一的和神圣的真理(在文件中向下滚动一点)。如果 GitHub-guy-file 对你不起作用,请在 GitHub 跟踪器上提交一个问题,我会解决的。

旧stuff/answer..

像这样 (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 中指定角色,而不添加另一个 shell 在 Vagrant 有机会之前安装 Ansible 的脚本,然后 运行 galaxy install 命令。我发现让 Vagrant 安装 Ansible 很方便,当 Ansible 应该是供应商时,我投入的每一个额外的 "script" 都会让人感觉很糟糕,哈哈。

根据记录,ansible-galaxy install 不需要指定角色 file;角色 name 作为命令的参数就足够了,在这种情况下角色将被下载 (docs).

我尝试了大约半天的时间来破解和削减人们可能设置的各种 Vagrant 选项,例如 galaxy_command 但每个新的诡计都会导致一个新问题,这对 Vagrant 来说是一个艰难的停止(听起来很熟悉??哈哈哈)。

如果您找到一种方法来设置内联角色而不依赖于另一个文件或 Vagrantfile 中的 nitehacked shell 脚本,请跟我打招呼 =)

如何更改 Ansible 角色文件的存储位置?

默认情况下,Ansible Galaxy 将角色文件下载到项目中的子目录:./roles/。 Ansible 在解析 playbook 文件时会自动在该子目录中查找角色。

考虑到我的个人目标是保持项目文件夹干净并尽可能少地向我的存储库提交垃圾,我发现这个位置不方便。值得庆幸的是,可以通过将 galaxy_roles_path 设置为 Ansible 也用于查找角色的另一个位置来更改 Galaxy 的下载路径:/etc/ansible/roles/.

要是这么简单就好了。

[至少在我的机器上:] 当 Vagrant 安装 Ansible 时,创建的文件夹仅对 root 用户具有写权限。即,当 ansible-galaxy install 运行 1 分钟后下载角色时,由于权限不足,一切都崩溃了。或者换个说法,Ansible 自己的 "home folder" 里也放不下狗屎。其实有点好笑。

解决方法是在 Ansible 设法搞砸自己之前向文件夹注入一些 chmod 魔法:

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 provisioner always 运行 是一个好习惯。这样他就可以做他的事,可以这么说。终端输出显示 vagrant up 在每个 运行 上下载并安装角色。这让我很烦。

galaxy_command 默认使用 --force 标志 - 为什么?不知道。但是删除它可以解决问题。现在我们收到警告:

[WARNING]: - mongrelion.docker (master) is already installed - use --force to change version to unspecified

令人厌烦。我应该受宠若惊,而不是警告 ;) Vagrant prolly 添加了 --force 标志来抑制此警告?一次偶然的机会,我找到了另一种解决方案。在角色定义中添加一个明确的版本标签(docs),瞧,警告被一些可爱的东西代替:

- mongrelion.docker (6a4fe8fc18550bfff8eeecd89888cf817cdf4bfc) is already installed, skipping.

如果您仍然收到警告消息,那是因为您在明确添加版本标签之前已经安装了另一个版本。因此,现在您必须至少使用一次 --force 来强制更新或手动删除旧的 (ansible-galaxy remove stupid.role)。

综上所述,这就是我最终得到的内容..

流浪文件:
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
  version: 6a4fe8fc18550bfff8eeecd89888cf817cdf4bfc