首页 文章

如何自动安装Ansible Galaxy角色?

提问于
浏览
83

所有我的Ansible剧本/角色都签入我的git仓库 .

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

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

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

6 回答

  • 109

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

  • 11

    如建议的那样,你可以使用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
    
  • 4

    我经常发现自己正在安装Java JDK . 使用角色可以使触摸变得更容易 . 我尝试了几种不同的方式(包括许多.gitmodules和子模块......我必须使用多个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
    

    我运行一个单独的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忽略,所以我不会错误地检查角色 . 此外,由于我每次都擦除文件夹,我确保我不需要强制或忽略错误 .

  • 41

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

  • 3

    另一种解决方案是使用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

    您可以使用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中应用此角色 before 您要使用它安装的任何其他角色 . 这是因为Ansible在运行您引用它们的playbook之前检查所有角色是否可用 .

相关问题