如何自动安装Ansible Galaxy角色?


129

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

但是,对于Ansible Galaxy角色,我总是必须在要从其运行Ansible的每台计算机上一一明确地下载它们。

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

应该如何管理Ansible Galaxy角色依赖性?我想让它们与我的其他Ansible代码一起检入我的git仓库中,或者当我在新机器上运行Ansible时自动识别并下载它们。


galaxy.ansible.com/docs/using/index.html这是使用ansible-galaxy所需的一切。这是一个做得很好的文档!即使您是初学者:)
Ayra

@pdeva您可以接受以下有效答案之一吗?
GG。

Answers:


148

您应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

这是一个工作示例(使用Ansible作为Vagrant预配器安装OpenDaylight)。有关更多信息,请参见相关的Ansible文档


另请参见下面的@Kieran Andrews答案。它扩展了这一点。
Marco Ferrari

1
这并不是真正自动安装剧本的角色依赖关系,而是显式安装一系列依赖关系的列表,这些依赖关系已由制作剧本的人员手动列出。
尼尔

53

如建议的那样,您可以根据需要使用反星系。

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 

1
刚刚经过测试,它会显示一条消息,说明角色已经下载,没有错误。版本2.2.1
Igonato

如果剧本使用了您要安装的银河角色,则在下载剧本之前先检查它们的存在,它们将不会在首次调用时运行。再次调用该剧本将接起新安装的角色。

我已经使用包装器脚本来减少命令,从而更新了现在的操作方式。
基兰·安德鲁斯

19

我经常发现自己正在安装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忽略,所以我不会错误地检查角色。另外,由于我每次都会清除文件夹,因此我确保无需强制或忽略错误。


在运行本地命令之前,它将失败并显示“找不到角色”。
Daniel AndreiMincă17年

1
@MincăDaniel Andrei,您需要使用动态方式,例如include_role。检查一下
user1686407 '18

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以防止将其代码提交到存储库中。


5
我认为这是不好的做法。使用依赖管理工具然后将SCM仓库粘合在一起通常更简单,尤其是在我们谈论SCM的git子模块时。
David Resnick

1
同意 实际上,我不再使用它了。由于ansible星系远非完美,它仍然是一种有效的方法。即使您的需求文件中有版本被修改,Galaxy也不检查更新,如果您强迫它重新下载所有带有未记录--force标志的角色,则它不会显示您是否实际更改了什么。如果您将下载的星系角色保留在SCM中,则只能控制它是一个黑匣子。但是出于其他原因,这还是个好主意。拉出子模块时,您至少会看到哪些角色已更改。
udondan '16

顺便说一句,子模块具有的所有问题,在这种情况下AFAIK可以忽略不计,因为它们与修改其内容有关。拉是完全没有用我的经验..
udondan

4

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

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

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

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

如果你这样做的作用,它已被应用之前,你想用它,在一个单独的剧本安装任何其他角色。这是因为Ansible在运行您引用它们的剧本之前检查所有角色是否都可用。


鸡蛋和鸡肉:)
bazeusz

2

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


3
您可以为此使用require.txt文件。请参阅:docs.ansible.com/…– toast38coza
2015年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.