如何自动安装Ansible Galaxyangular色?

我所有的Ansible剧本/angular色都被检入到我的git仓库中。

但是,对于Ansible Galaxyangular色,我总是必须在每台想要运行Ansible的机器上一个接一个地显式下载它们。

在Ansible抱怨运行时缺失的angular色之前,事先知道需要哪些Ansible Galaxyangular色甚至是非常困难的。

如何pipe理Ansible Galaxyangular色依赖关系? 我想要把他们和我的其他代码一起签入到我的git repo中,或者当我在新机器上运行Ansible时,自动识别和下载它们。

你应该为这个用例使用一个requirements.yml文件。 使用各种安装方法描述您需要的angular色:

 # Install a role from the Ansible Galaxy - src: dfarrell07.opendaylight # Install a role from GitHub - name: opendaylight src: https://github.com/dfarrell07/ansible-opendaylight # Install a role from a specific git branch - name: opendaylight src: https://github.com/dfarrell07/ansible-opendaylight version: origin/master # Install a role at a specific tag from GitHub - name: opendaylight src: https://github.com/dfarrell07/ansible-opendaylight version: 1.0.0 # Install a role at a specific commit from GitHub - name: opendaylight src: https://github.com/dfarrell07/ansible-opendaylight version: <commit hash> 

然后安装它们:

 ansible-galaxy install -r requirements.yml 

这里有一个工作示例 (使用Ansible作为Vagrantconfiguration程序安装OpenDaylight)。 有关更多信息,请参阅相关的Ansible文档 。

正如所build议的那样,您可以使用合适的星系来满足这个需求。

Ansible有一个function,您可以创build一个列出所有angular色的requirements.yml文件。 你可以在这里find关于这个: http : //docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

例如(requirements.yml):

 - src: yatesr.timezone 

然后在这个文件上运行ansible-galaxy install -r requirements.yml来下载列出的所有angular色。

如果你想进一步自动化,那么你可以创build一个简单的shell脚本来运行这两个命令。

例如(ansible.sh):

./ansibe.sh

 ansible-galaxy install -r requirements.yml ansible-playbook playbook.yml -i inventory 

我经常发现自己安装了一个Java JDK。 使用angular色使得触摸更容易。 我已经尝试了几种不同的方法(包括很多.gitmodules和子模块…我必须使用多个git系统才能工作,而且所有这些都变得很难看)。 我最大的要求是,我不检查angular色代码到我的剧本项目,主要是我可以保持在一个地方的一切。

我的'requirements.yml'文件的内容:

 - src: https://github.com/staylorx/ansible-role-wls-prep.git version: master name: staylorx.wls-prep - src: https://my-work-git-extravaganza.com version: 2.x name: coolplace.niftyrole #From Ansible Galaxy - src: staylorx.oracle-jdk 

我运行一个单独的剧本install-roles.yml:

 --- - hosts: localhost tasks: - file: path: roles state: absent - local_action: command ansible-galaxy install -r requirements.yml --roles-path roles - lineinfile: dest: .gitignore regexp: '^\/roles$' line: '/roles' state: present 

我运行这个第一个剧本,然后通常在任何剧本中运行我的angular色。 对我来说,秘密是确保它被git忽略,所以我不会错误地检查angular色。 另外,由于我每次擦除文件夹,我确保我不需要强制或忽略错误。

在这个时候,据我所知,在运行时没有自动的方式来下载angular色。 你最好的select是把它们提交到你自己的回购站里,或者有适当的文件列出所有的要求。 你甚至可以创build一个安装你的angular色的飞行前剧本。 🙂

另一个解决scheme是使用git子模块。 毕竟,Ansible Galaxy只是一个github仓库的目录…

我使用此命令自动添加任何Galaxyangular色作为子模块:

 ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh 

把这些改变提交到你的git仓库。 当你将来克隆你的repo时,请确保使用子模块克隆它,例如git clone ... --recursive

这样做的好处是,一个git子模块总是引用一个特定的版本(git commit-hash)。 这将阻止您在生产环境中运行未经testing的更新。 银河angular色的新版本可能有错误或工作完全不同于以前。 使用git子模块,您可以决定是否以及何时将angular色更新为新版本。

此外,您不必额外处理.gitignore的黑名单星系angular色,以防止将代码提交到您的存储库。

您可以使用Ansibleangular色来使用命令模块安装其他所需的angular色。

这是一个非常基本的例子,运行安全ansible-galaxy install

 - name: Install roles from Ansible Galaxy command: ansible-galaxy install {{ item.item }} with_items: - "{{ ansible_roles_list }}" 

ansible_roles_list可以作为variables或angular色参数提供。

我为此实现了一个angular色,因此您可以使用Ansible来设置(部分)控制机器: https ://galaxy.ansible.com/ferrarimarco/install-roles/。

这个angular色必须你想要使用它安装的任何其他angular色之前应用,在一个单独的剧本中。 这是因为在运行引用它们的剧本之前,Ansible会检查是否所有angular色都可用。