9

仅使用一个剧本,那么不可能让 Ansible 自动安装依赖角色。至少根据这个SO thread

但是,我有使用Vagrant和 Vagrant 的Ansible local provisioner的额外“优势” 。我可以应用任何技巧吗?

4

1 回答 1

23

2018 年 11 月 22 日更新!

鉴于软件的发展,我不能保证下面所有的“旧东西/答案”仍然是合法的,并且不会让你的机器着火哈哈。然而,我确实在 GitHub 上维护了一个 Vagrantfile,它确实自动安装了 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

---
- 源代码:mongrelion.docker

请注意我的 1 角色是如何在一个单独的文件中指定的,这完全是矫枉过正。我想在 Vagrantfile 中指定角色,而不添加另一个在 Vagrant 有机会之前安装 Ansible 的 shell 脚本,然后运行 ​​Galaxy install 命令。我发现让 Vagrant 安装 Ansible 很方便,而且当 Ansible 应该是配置器时,我投入的每一个额外“脚本”都感觉很糟糕,哈哈。

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

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

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

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

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

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

要是这么容易就好了。

[至少在我的机器上:] 当 Vagrant 安装 Ansible 时,创建的文件夹仅具有 root 用户的写入权限。即ansible-galaxy install1分钟后运行并下载角色时,由于权限不足,一切都崩溃了。或者换一种说法,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 (6a4fe8fc18550bffff8eeecd89888cf817cdf4bfc) 已经安装,跳过。

如果您仍然收到警告消息,那是因为您在明确添加版本标签之前已经安装了另一个版本。因此,现在您必须--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
要求.yml:

---
- src:mongrelion.docker
  版本:6a4fe8fc18550bfff8eeecd89888cf817cdf4bfc

于 2017-09-04T23:47:13.667 回答