如何自动安装Ansible Galaxy角色?

如何自动安装Ansible Galaxy角色?,ansible,ansible-playbook,ansible-galaxy,Ansible,Ansible Playbook,Ansible Galaxy,我所有的Ansible剧本/角色都已签入我的git repo 然而,对于Ansible Galaxy角色,我总是要在我想要运行Ansible的每台机器上一个接一个地显式下载它们 在Ansible抱怨运行时缺少角色之前,甚至很难提前知道需要哪些Ansible Galaxy角色 如何管理Ansible Galaxy角色依赖关系?我希望将它们与ansible代码的其余部分一起签入我的git repo,或者在新机器上运行ansible时自动识别并下载它们。目前,据我所知,在运行时没有自动下载角色的方法。

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

然而,对于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作为流浪者供应器安装OpenDaylight)。有关更多信息,请参阅。

另一种解决方案是使用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
ansible galaxy info|grep-A 1 github\u repo | tr'\n''sed-e“s/*github\u repo:\([^[:space:]*\)[^\w]*github\u用户:\([^[:space:]]*/git子模块添加git:\/\/github.com\/\2\/\1.git角色\/\2.\1/g”\sh
然后将更改提交到git repo。将来克隆回购协议时,请确保使用子模块进行克隆,例如,
git clone--递归的

这样做的一个优点是,git子模块总是引用特定的版本(git提交哈希)。这将阻止您在生产环境中运行未经测试的更新。新版本的Galaxy角色可能会有bug或工作方式与以前完全不同。通过git子模块,您可以决定是否以及何时将角色更新到新版本


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

根据建议,您可以使用ansible galaxy来满足此需求

Ansible有一个功能,您可以在其中创建一个列出所有角色的
requirements.yml
文件。您可以在此处找到相关信息:

例如(requirements.yml):

然后在此文件上运行
ansible galaxy install-r requirements.yml
,下载此处列出的所有角色

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

例如(ansible.sh):

/ansible.sh

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

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

我的“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\u roles\u列表可以作为变量或角色参数提供


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

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

如果requirements.yml位于项目的roles目录中,那么Tower/AWX会自动安装这些角色

  • 在gitlab帐户上创建一个组,在其中放置所有角色
  • 转到设置/存储库并添加具有读取权限的令牌
  • 复制令牌名称:令牌并将其粘贴到requirements.yml文件中
  • -src:'https://:@gitlab.com/ansible-cim/roles/instnginx.git'
    scm:'git'
    版本:“v0.0.1”
    名称:'instnginx'
    
  • 如有必要,请编辑ansible.cfg,以指明角色的安装位置
  • 创建文件夹/角色(如果需要)
  • 启动ansible galaxy命令
  • mkdir角色
    ansible galaxy安装-r requirements.yml
    
    您可以为此使用requirements.txt文件。参见:另见下文@Kieran Andrews的答案。它扩展了这个。这并不是真正自动安装剧本的角色依赖项,而是显式安装一个由制作剧本的人手动列出的依赖项列表。在我看来,这是一个糟糕的做法。使用依赖关系管理工具通常比将SCM repo粘合在一起更简单,特别是当我们讨论SCM的git子模块时。事实上我不再用这个了。尽管如此,这仍然是一个有效的方法,因为ansible星系还远远不够完美。Galaxy不会检查更新,即使您的需求文件中出现版本冲突,如果您使用未记录的
    --force
    标志强制Galaxy重新下载所有角色,Galaxy也不会显示是否或实际更改了什么。只有将下载的galaxy角色保存在SCM中,才能控制它。不过,出于其他原因,这是个好主意。拉取子模块时,您至少可以看到哪些角色已更改。顺便说一句,所有
    ---
    
    - 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
    
    - name: Install roles from Ansible Galaxy
      command: ansible-galaxy install {{ item.item }}
      with_items:
        - "{{ ansible_roles_list }}"
    
     # 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
    
    [defaults]
    roles_path=./roles