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

时间:2017-09-04 23:47:14

标签: vagrant ansible vagrantfile ansible-role ansible-galaxy

仅使用一个剧本,然后Ansible不可能自动安装相关角色。至少根据这个SO thread

但是,我有使用 Vagrant 和Vagrant的 Ansible本地配置程序的额外“优势”。我可以申请任何技巧吗?

1 个答案:

答案 0 :(得分:15)

更新2018-11-22!

鉴于软件的发展,我不能保证下面所有的“旧东西/答案”仍然是合法的,不会让你的机器着火哈哈。但是,我确实维护了一个Vagrantfile on GitHub,它会自动安装Ansible Galaxy角色,这个人应该被认为是唯一一个神圣的事实(在文件中向下滚动一下)。如果GitHub-guy文件不能用于ya,请在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个角色是如何在单独的文件中指定的,这完全有点过分。我想在Vagrant文​​件中指定角色,而不添加另一个在Vagrant有机会之前安装Ansible的shell脚本然后运行galaxy install命令。我发现让Vagrant安装Ansible很方便,而且当Ansible应该是供应商大声笑时,我对每一个额外的“脚本”感觉很糟糕。

对于记录,ansible-galaxy install不需要指定角色文件;一个角色 name 作为命令的参数就足够了,在这种情况下,角色将被下载(docs)。

我尝试了大约半天的时间来破解和削减可能设置的各种Vagrant选项,例如galaxy_command但是每个新的技巧都会引发一个新的问题,这对于Vagrant来说是一个难以理解的事情(听起来很熟悉?哈哈哈)

如果你找到了一种方法来设置内联角色,而不依赖于另一个文件或Vagrantfile中的nitehacked shell脚本,请对我说吧=)

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

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

我认为这个位置不方便,因为我个人的目标是保持项目文件夹干净并尽可能少地提交到我的存储库。值得庆幸的是,可以通过将galaxy_roles_path设置为Ansible还用于在/etc/ansible/roles/中查找角色的其他位置来更改Galaxy的下载路径。

如果只是那么容易。

[至少在我的机器上:]当Vagrant安装Ansible时,只为root用户创建具有写权限的文件夹。即,当ansible-galaxy install在1分钟后运行并下载角色时,由于权限不足,所有内容都会崩溃。或者换句话说,Ansible不能把狗屎放在他自己的“主文件夹”中。实际上这很有趣。

修复是在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供应商始终运行是一个好习惯。可以这么说,他可以做他自己的事情。终端输出显示vagrant up下载并在每次运行时安装角色。这让我感到烦恼。

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

  

[警告]: - 已安装mongrelion.docker(master) - 使用--force to   将版本更改为未指定的

令人疲倦。我应该受宠若惊,没有警告;)Vagrant加上--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