Mar*_*son 8 vagrant ansible vagrantfile ansible-galaxy ansible-role
仅使用一个剧本,则Ansible无法自动安装从属角色.至少根据这个SO线程.
但是,我有使用Vagrant和Vagrant的Ansible本地配置器的额外"优势" .我可能申请的任何技巧?
Mar*_*son 17
鉴于软件的发展,我不能保证下面的所有"旧的东西/答案"仍然是合法的,不会让你的机器开火lol.但是,我确实在GitHub上维护了一个自动安装Ansible Galaxy角色的Vagrantfile,这个人应该被认为是唯一一个神圣的事实(在文件中向下滚动一下).如果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
Run Code Online (Sandbox Code Playgroud)
内容requirements.yml:
---
- src:mongrelion.docker
请注意我的1个角色是如何在一个单独的文件中指定的,这完全是过度的.我想在Vagrant文件中指定角色,而不添加另一个在Vagrant有机会之前安装Ansible的shell脚本然后运行galaxy install命令.我发现让Vagrant安装Ansible很方便,而且当Ansible应该是供应商大声笑时,我对每一个额外的"脚本"感觉很糟糕.
对于记录,ansible-galaxy install不需要指定角色文件 ; 作为命令参数的角色名称就足够了,在这种情况下,角色将被下载(docs).
我尝试了大约半天的时间来破解并削减可能设置的各种流浪者选项,例如galaxy_command但是每个新的技巧都引发了一个新问题,这对于Vagrant来说是一个难以理解的事情(听起来很熟悉?哈哈哈).
如果你找到一种方法来设置内联角色,而不依赖于另一个文件或Vagrantfile中的nitehacked shell脚本,请在我身边看看=)
默认情况下,Ansible Galaxy将角色文件下载到项目的子目录中:./roles/.在解析playbook文件时,Ansible会自动在此子目录中查找角色.
我发现这个位置不方便,因为我个人的目标是保持项目文件夹干净并尽可能少地提交到我的存储库.值得庆幸的是,可以通过设置galaxy_roles_pathAnsible还用于查找角色的另一个位置来更改Galaxy的下载路径:/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
Run Code Online (Sandbox Code Playgroud)
我发现让Ansible供应商始终运行是一个好习惯.可以这么说,他可以做他自己的事情.终端输出显示vagrant up在每次运行时下载并安装角色.这让我感到烦恼.
在galaxy_command默认情况下使用--force标志-为什么?不知道.但删除它解决了这个问题.现在我们收到警告:
[警告]: - 已经安装了mongrelion.docker(master) - 使用--force将版本更改为未指定
烦人.我应该受宠若惊,没有警告;)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
Run Code Online (Sandbox Code Playgroud)
requirements.yml:
---
- src:mongrelion.docker
版本:6a4fe8fc18550bfff8eeecd89888cf817cdf4bfc