如何自动安装安赛尔银河角色?

我所有的安塞尔剧本/角色都签入了我的 Git 回购。

然而,对于安塞尔银河系的角色,我总是必须在每台我想运行安塞尔的机器上一个一个地显式下载它们。

事先甚至很难确切地知道哪些安塞尔银河角色是需要的,直到安塞尔抱怨在运行时缺少一个角色。

人们应该如何管理安赛波星系的角色依赖关系?我想要他们签入我的 git 回购和我的其余可变代码或有他们自动识别和下载时,我运行一个新的机器可变。

90683 次浏览

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

对于这个用例,您应该使用一个 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

这里有一个 工作范例(使用流浪者提供者安装 OpenDaylight)。更多信息参见 相关的可疑文件

另一个解决方案是使用 git 子模块。

我使用这个命令自动添加任何 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 角色可能有 bug,或者工作方式与以前完全不同。使用 git 子模块,您可以决定是否以及何时将角色更新到新版本。

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

正如建议的那样,你可以使用可能的星系来满足这个需要。

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

例如:

- 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

我经常发现自己在安装 JavaJDK。使用角色可以使触摸变得更容易。我尝试了几种不同的方法(包括很多。Gitmodule 和子模块... ... 我必须使用多个 git 系统工作,所有这些都变得很难看)。我最大的需求是不要将角色代码签入到我的剧本项目中,主要是为了将所有内容保存在一个地方。

我的‘ requments.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-role. 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 忽略,这样我就不会错误地检入角色。另外,由于每次都要清除文件夹,因此我确保不需要强制或忽略错误。

您可以使用安塞尔角色使用 指挥舱安装所需的角色。

下面是运行 ansible-galaxy install的一个非常基本的例子:

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

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

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

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

如果 requments.yml 驻留在项目的角色目录中,那么 Tower/AWX 会自动安装角色。

  1. 在你的 gitlab 帐户上创建一个组,你把你所有的角色
  2. 转到设置/存储库并添加具有读取权限的令牌
  3. 复制标记-name: 标记并将其粘贴到 requments.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. 如果需要,创建文件夹./角色
  2. 发射安塞尔星系指令
mkdir roles
ansible-galaxy install -r requirements.yml

我使用克罗诺的方法在 AWX,但也在我的本地可控制器。

它工作得很好,但是不知怎么搞乱了角色最终下载到的路径。

我的 Git 项目被称为“ role”,我将其添加到 requments.yml:

- src: "git+https://<token_name>:<token>@gitlab.mydomain.com/mygroup/ansible/roles.git"

当我跑的时候

ansible-galaxy install -r requirements.yml

在同步之后,我在我的角色目录中得到了这个文件夹结构:

├── roles
│  └── roles
│       └── My_Role
│            ├── tasks
│            │   └── main.yml

这迫使我在剧本中加入这样的角色:

  hosts: [all]
roles:
- roles/roles/My_Role

有没有办法在没有根文件夹的情况下从 git 同步角色? 你可以通过:

git clone "https://<token_name>:<token>@gitlab.mydomain.com/mygroup/ansible/roles.git ."

但是点约定在 requirements.yml文件中不起作用。

任何想法都会很受欢迎。

如何在剧本中安装一个可视的银河系角色:

- name: Install role from Ansible Galaxy
local_action: command /usr/bin/ansible-galaxy install <GALAXY_PACKAGE_NAME>

没有自动下载剧本所需角色的机制。正如其他人所建议的那样,使用 requirements.yml文件是实现此目的的一种方法,也许是最好的方法。

但是,您也可以使用角色的 meta/main.yml文件来指定它的依赖项。请参阅 角色文档页面。例如,如果您正在使用私有回购,则可以使用此语法。

dependencies:
- name: java
src: ssh://git@myServer/myWorkspace/myRole.git
scm: git
version: master

因此,您可以定义一个 requirements.yml文件来下载 myRole,然后它将下载它需要的任何角色,然后它们可以通过它们的 meta/main.yml文件下载它们需要的任何角色。这是更多的工作,有一个 requirements.yml文件 IMO。

简而言之,你不能。最好的情况下,你可以添加一个单独的角色来进行安装,但是如果你试图在你的剧本中加入一个银河系的角色,它仍然会失败。所以除了手动安装,没有别的办法。是的,这很荒谬,就像 Ansible 的其他许多事情一样。