我所有的 Ansible 剧本/角色都签入到我的 git 存储库中。
但是,对于 Ansible Galaxy 角色,我总是必须在每台要运行 Ansible 的机器上显式下载它们。
在 Ansible 抱怨运行时缺少角色之前,甚至很难提前确切知道需要哪些 Ansible Galaxy 角色。
应该如何管理 Ansible Galaxy 角色依赖关系?我想让它们与我的其余 ansible 代码一起检查到我的 git repo 中,或者在我在新机器上运行 Ansible 时自动识别和下载它们。
我所有的 Ansible 剧本/角色都签入到我的 git 存储库中。
但是,对于 Ansible Galaxy 角色,我总是必须在每台要运行 Ansible 的机器上显式下载它们。
在 Ansible 抱怨运行时缺少角色之前,甚至很难提前确切知道需要哪些 Ansible Galaxy 角色。
应该如何管理 Ansible Galaxy 角色依赖关系?我想让它们与我的其余 ansible 代码一起检查到我的 git repo 中,或者在我在新机器上运行 Ansible 时自动识别和下载它们。
您应该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 文档。
如建议的那样,您可以使用 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
我经常发现自己在安装 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 忽略,所以我不会错误地检查角色。此外,由于我每次都清除文件夹,因此我确保不需要强制或忽略错误。
您可以使用 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 在运行您引用它们的 playbook 之前检查所有角色是否可用。
另一种解决方案是使用 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 子模块,您可以决定是否以及何时将角色更新到新版本。
此外,您不必另外处理将 Galaxy 角色列入黑名单.gitignore以防止将其代码提交到您的存储库。
目前,据我所知,在运行时没有自动下载角色的方法。您最好的选择是将它们提交到您自己的存储库中,或者拥有列出所有要求的适当文档。您甚至可以创建一个飞行前的剧本来安装您的角色。:)
在这里,我的要求是关于角色并在 install.yml 中使用
主要的.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
- src: 'https://<token-name>:<token>@gitlab.com/ansible-cim/roles/instnginx.git'
scm: 'git'
version: 'v0.0.1'
name: 'instnginx'
[defaults]
roles_path=./roles
mkdir roles
ansible-galaxy install -r requirements.yml
如果 requirements.yml 位于项目的角色目录中,则 Tower/AWX 会自动安装角色。