【问题标题】:Where to place requirements.yml for Ansible and use it to resolve dependencies?在哪里放置 Ansible 的 requirements.yml 并使用它来解决依赖关系?
【发布时间】:2019-09-10 09:54:43
【问题描述】:

我是 ansible 的新手,正在探索依赖角色。 documentation link

我没有看到文档是 - 放置 requirements.yml 文件的位置。

例如,如果我的site.yml 看起来像这样:

---
- name: prepare system
  hosts: all
  roles:
     - role1

还有,让我们说

  • role1 依赖于 role2 和 role3
  • role2 依赖于 role4 和 role5

通常,ansible-galaxy 具有以下结构:

└── test-role
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml

依赖关系,添加到meta/main.yml。假设,角色 1 在此文件中标记了依赖项,例如(角色 2 也是如此):

dependencies: 
  - role: role2
  - role: role3

而且,我还有一个requirements.yml 文件,看起来像:

---    
- src: some git link1
  version: master
  name: role2
- src: some git link2
  version: master
  name: role3

我的问题: 我应该将这个 requirements.yml 文件放置在哪里?

我了解需要通过命令安装要求,

ansible-galaxy install -r requirements.yml -p roles/

而且,我可以为角色 1 执行此操作,但如何为角色 2 自动执行此操作?后续的依赖是否需要这样手动解析安装,还是有更好的办法?

【问题讨论】:

    标签: ansible ansible-role


    【解决方案1】:

    从技术上讲,您可以将 requirements.yml 文件放在您喜欢的任何位置,只要您在 ansible-galaxy install 命令中反映正确的路径即可。

    同时,如果你想从 Ansible Tower/Awx 运行你的剧本,我建议你坚持使用 Ansible Tower requirements 并将你的 requirements.yml 文件放在 <project-top-level-directory>/roles/requirements.yml 中

    关于角色之间的依赖关系,ansible-galaxy 在安装过程中遇到它们时能够自行跟踪。所以你不需要在你的requirements.yml 中指定所有这些,只需要顶级的。您只需要在每个外部角色中正确指定您的依赖项。

    在meta/main.yml 中为角色1

    dependencies:
      - src: https://my.scm.com/my-ansible-roles/role2.git
        scm: git
        version: master
        name: role2
      - src: https://my.scm.com/my-ansible-roles/role3.git
        scm: git
        version: master
        name: role3
    

    在meta/main.yml 中为角色2

    dependencies:
      - src: https://my.scm.com/my-ansible-roles/role4.git
        scm: git
        version: master
        name: role4
      - src: https://my.scm.com/my-ansible-roles/role5.git
        scm: git
        version: master
        name: role5
    

    roles/requirements.yml

    ---    
    - src: https://my.scm.com/my-ansible-roles/role1.git
      scm: git
      version: master
      name: role1
    

    为了尽可能详尽,这是我现在通常在我的项目上执行的处理本地依赖项以及本地/项目唯一角色的操作

    基本项目结构

    ansible-project-dir
    └─── roles
    |    └─── locally-versioned-role1
    |    └─── locally-versioned-role2
    |    └─── ...
    |    └─── requirements.yml
    |    └─── .gitignore
    └─── ansible.cfg
    └─── playbook1.yml
    └─── playbook2.yml
    

    ansible.cfg

    我通过设置roles_path = roles强制在本地roles目录中搜索和下载角色,因此用户可以在没有-p参数的情况下使用ansible-galaxy install。

    roles/requirements.yml

    上面已经讨论过了。只需将依赖关系列为顶级外部(即项目中未版本化)作为 Galaxy 角色名称或 git uris。如果您需要完全签出这些角色以便稍后对它们进行 git 提交/推送,您可以使用 ansible-galaxy install -g -f -r roles/requirements

    roles/.gitignore

    # Ignore everything in roles dir
    /*
    # Except:
    # the .gitignore file
    !.gitignore
    # the requirements file
    !requirements.yml
    # Readme if you have one
    !README.md
    # and any specific role we want to version locally
    !locally-versioned-role*/
    
    
    

    【讨论】:

    • 如果使用roles/requirements.yml 声明对 git 存储库 (scm: git) 的依赖关系,AWX/Tower 如何处理对 git 存储库的身份验证?有办法指定吗?
    • @trebor 我正在运行一个相当旧的 AWX 版本,所以他们可能已经解决了这个问题(现在没有足够的时间检查)。但是在我的版本(3.0.0.0,请不要笑...),我只能在项目表单中提供一个密钥或用户/通行证scm识别凭证。因此,您可以访问项目和角色的私有 git 存储库,但它们都应该共享相同的凭据(例如部署密钥)。这是我的情况,它有效(来自 git scm 的项目和私有角色)。
    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多