如何自动安装Ansible Galaxy角色?

pde*_*eva 113 ansible ansible-playbook ansible-galaxy

所有我的Ansible剧本/角色都签入我的git仓库.

但是,对于Ansible Galaxy角色,我总是必须在我想运行Ansible的每台机器上逐个明确地下载它们.

在Ansible抱怨在运行时缺少角色之前,确切地知道确切需要哪些Ansible Galaxy角色甚至是很难的.

如何管理Ansible Galaxy角色依赖项?我想让他们检查我的git repo以及其余的ansible代码,或者在我在新机器上运行Ansible时自动识别和下载它们.

dfa*_*l07 133

您应该requirements.yml为此用例使用文件.使用各种安装方法描述您需要的角色:

# 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>
Run Code Online (Sandbox Code Playgroud)

然后安装它们:

ansible-galaxy install -r requirements.yml
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例(使用Ansible作为Vagrant配置程序安装OpenDaylight).有关详细信息,请参阅相关的Ansible文档.

  • 这并不是真正自动安装剧本的角色依赖项,而是显式安装由制作剧本的人员手动列出的依赖项列表。 (4认同)

Kie*_*ews 48

如建议的那样,你可以使用ansible galaxy满足这种需求.

Ansible有一个功能,您可以在其中创建requirements.yml列出所有角色的文件.你可以在这里找到相关信息:http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file

例如(requirements.yml):

- src: yatesr.timezone
Run Code Online (Sandbox Code Playgroud)

然后ansible-galaxy install -r requirements.yml,您可以在此文件上运行以下载其中列出的所有角色.

如果您想进一步自动化它,您可以创建一个简单的shell脚本来运行这两个命令.

例如(ansible.sh):

./ansible.sh

ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory 
Run Code Online (Sandbox Code Playgroud)


sta*_*orx 18

我经常发现自己正在安装Java JDK.使用角色可以更轻松地完成触摸.我尝试了几种不同的方式(包括许多.gitmodules和子模块......我必须使用多个git系统进行工作,而且它变得很难看).我最大的要求是我没有将角色代码检查到我的playbook项目中,主要是因为我可以将所有内容保存在一个地方.

我的'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
Run Code Online (Sandbox Code Playgroud)

我运行一个单独的playbook,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
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ari 8

您可以使用 Ansible 角色通过命令模块安装所需的角色。

这是一个运行的非常基本的示例ansible-galaxy install

- name: Install roles from Ansible Galaxy
  command: ansible-galaxy install {{ item.item }}
  with_items:
    - "{{ ansible_roles_list }}"
Run Code Online (Sandbox Code Playgroud)

ansible_roles_list可作为可变的或作为角色参数提供。

如果您在角色中执行此操作,则必须要使用它安装的任何其他角色之前在单独的剧本中应用它。这是因为 Ansible 在运行您引用它们的剧本之前检查是否所有角色都可用。

  • 鸡蛋和鸡肉:) (5认同)

udo*_*dan 5

另一种解决方案是使用 git 子模块。毕竟,Ansible Galaxy 只是 github 存储库的目录...

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

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
Run Code Online (Sandbox Code Playgroud)

然后将更改提交到您的 git 存储库。当你以后克隆你的 repo 时,确保用子模块克隆它,例如git clone ... --recursive

这样做的一个优点是,git 子模块始终引用特定版本(git commit-hash)。这将阻止您在生产环境中运行未经测试的更新。新版本的 Galaxy 角色可能有错误或工作方式与以前完全不同。使用 git 子模块,您可以决定是否以及何时将角色更新到新版本。

此外,您无需额外处理将星系角色列入黑名单.gitignore以防止将其代码提交到您的存储库。

  • 在我看来,这是不好的做法。使用依赖管理工具然后将 SCM 存储库粘合在一起通常更简单,尤其是当我们谈论 SCM 的 git 子模块时。 (5认同)
  • 同意。事实上我不再使用这个了。但这仍然是一种有效的方法,因为 ansible-galaxy 远非完美。Galaxy 不会检查更新,即使您的需求文件中出现了某个版本,如果您使用未记录的“--force”标志强制它重新下载所有角色,它也不会向您显示是否发生了实际更改或发生了什么实际更改。它是一个黑匣子,只有在 SCM 中保留下载的星系角色时才能控制。出于其他原因,无论如何,这都是个好主意。当拉取子模块时,您至少会看到哪些角色发生了变化。 (3认同)
  • 顺便说一句,子模块的所有问题,据我所知在这种情况下都可以忽略不计,因为它们与修改其内容有关。根据我的经验,拉动完全没问题。 (2认同)

Mxx*_*Mxx 3

目前,据我所知,没有在运行时自动下载角色的方法。您最好的选择是将它们提交到您自己的存储库中,或者拥有列出所有要求的适当文档。您甚至可以创建一个飞行前的剧本来安装您的角色。:)