如何自动安装Ansible Galaxy角色?

时间:2014-08-10 15:56:10

标签: ansible ansible-playbook ansible-galaxy

我的所有Ansible剧本/角色都已签入我的git repo。

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

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

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

9 个答案:

答案 0 :(得分:123)

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

答案 1 :(得分:44)

根据建议,您可以使用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):

./ansibe.sh

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

答案 2 :(得分:16)

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

我的&#39; requirements.yml&#39;的内容。文件:

- 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

我运行一个单独的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

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

答案 3 :(得分:4)

另一个解决方案是使用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仓库。在将来克隆您的repo时,请确保使用子模块克隆它,例如git clone ... --recursive

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:3)

您可以使用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来设置(部分)控制机器:https://galaxy.ansible.com/ferrarimarco/install-roles/

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

答案 6 :(得分:0)

在这里,我的要求是角色,并在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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

  1. 在您的 gitlab 帐户上创建一个组,您可以在其中放置所有角色
  2. 转到设置/存储库并添加具有读取权限的令牌
  3. 复制 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'
  1. 如有必要,请编辑 ansible.cfg 以指示将安装角色的位置
[defaults]
roles_path=./roles
  1. 如有必要,创建文件夹 ./roles
  2. 启动 ansible-galaxy 命令
mkdir roles
ansible-galaxy install -r requirements.yml
相关问题