如何自动安装 Ansible Galaxy 角色?

Posted

技术标签:

【中文标题】如何自动安装 Ansible Galaxy 角色?【英文标题】:How to automatically install Ansible Galaxy roles? 【发布时间】:2014-10-03 12:28:45 【问题描述】:

我所有的 Ansible 剧本/角色都签入到我的 git 存储库中。

但是,对于 Ansible Galaxy 角色,我总是必须在每台要运行 Ansible 的机器上显式下载它们。

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

应该如何管理 Ansible Galaxy 角色依赖关系?我想让它们与我的其余 ansible 代码一起签入我的 git 存储库,或者在我在新机器上运行 Ansible 时自动识别和下载它们。

【问题讨论】:

galaxy.ansible.com/docs/using/index.html 这是使用 ansible-galaxy 所需的一切。这是一个做得很好的文档!即使你是初学者:) @pdeva 您能接受以下有效答案之一吗? 【参考方案1】:

您应该为此用例使用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>

然后安装它们:

ansible-galaxy install -r requirements.yml

这是一个working example(使用 Ansible 作为 Vagrant 配置器安装 OpenDaylight)。请参阅relevant Ansible docs 了解更多信息。

【讨论】:

另请参阅下面的@Kieran Andrews 回答。它扩展了这个。 这并不是真正自动安装剧本的角色依赖项,而是显式安装由制作剧本的人手动列出的依赖项列表。【参考方案2】:

按照建议,您可以使用 ansible galaxy 来满足此需求。

Ansible 有一个功能,您可以在其中创建一个列出所有角色的requirements.yml 文件。你可以在这里找到: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 以下载其中列出的所有角色。

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

例如(ansible.sh):

./ansible.sh

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

【讨论】:

刚测试,提示角色已经下载,没有错误。版本2.2.1 如果 playbook 使用了您正在安装的 Galaxy 角色,那么在第一次调用 playbook 时它们将不会运行,因为在下载它们之前会检查它们的存在。再次调用 playbook 将获取新安装的角色。 我已经更新了我现在的做法,使用包装脚本来减少命令。【参考方案3】:

我经常发现自己在安装 Java JDK。使用角色使这种接触更容易。我尝试了几种不同的方法(包括许多 .gitmodules 和子模块......我必须使用多个 git 系统来工作,而且一切都变得丑陋)。我最大的要求是不要将角色代码检查到我的剧本项目中,主要是为了将所有内容保存在一个地方。

我的“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

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

【讨论】:

在你运行本地命令之前它会失败并显示“找不到角色”。 @Mincă Daniel Andrei 您需要使用动态方式,例如 include_role。检查this【参考方案4】:

您可以使用 Ansible 角色通过 command module 安装所需的角色。

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

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

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

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

【讨论】:

鸡蛋和鸡肉:)【参考方案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

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

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

此外,您不必另外注意将 .gitignore 中的星系角色列入黑名单,以防止将其代码提交到您的存储库。

【讨论】:

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

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

【讨论】:

您可以为此使用 requirements.txt 文件。见:docs.ansible.com/…【参考方案7】:
    在您的 gitlab 帐户上创建一个组,您可以在其中放置所有角色 转到设置/存储库并添加具有读取权限的令牌 复制 token-name:token 并将其粘贴到 requirements.yml 文件中
- src: 'https://<token-name>:<token>@gitlab.com/ansible-cim/roles/instnginx.git'
  scm: 'git'
  version: 'v0.0.1'
  name: 'instnginx'
    如有必要,编辑 ansible.cfg 以指明角色的安装位置
[defaults]
roles_path=./roles
    如有必要,创建文件夹 ./roles 启动 ansible-galaxy 命令
mkdir roles
ansible-galaxy install -r requirements.yml

【讨论】:

【参考方案8】:

这里,我的要求是对角色的要求,用在install.yml中

main.yml

 # tasks file for MY_ROLE
- name: Install requirements
  local_action: command ansible-galaxy install -r  role_path /requirements.yml -p /etc/ansible/roles

- include_tasks: install.yml 
.  
├── playbook.yml  
├── inventory  
├── roles  
│    └── My_Role   
│        ├── tasks  
│        │   └── main.yml  
│        │   └── install.yml  
│        └── requirements.yml

【讨论】:

【参考方案9】:

如果 requirements.yml 位于项目的角色目录中,则 Tower/AWX 会自动安装角色。

【讨论】:

以上是关于如何自动安装 Ansible Galaxy 角色?的主要内容,如果未能解决你的问题,请参考以下文章

Ansible 角色/包 - Ansible Galaxy - 安装 MAC OSX 时出错

RHCE-B5. 使用Ansible Galaxy 安装角色

八ansible roles和ansible galaxy

Ansible-Galaxy

更新Ansible Galaxy页面

RHCE-B7. 从 Ansible Galaxy 使用角色创建web负载均衡