gpt4 book ai didi

bash - 我可以使用 ansible-galaxy 和 requirements.yml 的变量替换吗?

转载 作者:行者123 更新时间:2023-11-29 09:06:02 29 4
gpt4 key购买 nike

我们有许多 Ansible 角色的私有(private) git 存储库。 repo 主机因站点而异,例如:

  • Site1 使用 https://gitforsite1.ourdomain.com
  • Site2 使用 https://gitforsite2.ourdomain.com

我想要的是拥有一个 requirements.yml 文件并替换正确的 git repo。我可以这样做的一种方法是让 bash 脚本设置一个环境变量:

#!/bin/bash
...
if [ "$1" = "site1" ]; then
export REPO_ROOT="https://gitforsite1.ourdomain.com"
fi
if [ "$1" = "site2" ]; then
export REPO_ROOT="https://gitforsite2.ourdomain.com"
fi
... error checking if the value is not site1 or site2 ...
# Then install the roles
ansible-galaxy install -f -r config/requirements.yml -p roles

然后在 requirements.yml 中替换这个值:

---

- src: {{ lookup('env', 'REPO_ROOT') }}/role1.git
name: role1

- src: {{ lookup('env', 'REPO_ROOT') }}/role.git
name: role2

这种方法给出:错误!无法从需求文件加载数据 提示文件结构不正确。 (可能是该方法有效,但我的语法有误。)

任何让我设置变量(环境、命令行等)的方法都可以。或者,如果不支持,我是否需要在运行时重写 requirements.yml 文件,也许使用 sed

编辑 1:在上面的 bash 脚本摘录中添加了 ansible-galaxy 行,以显示如何使用 requirements.yml 文件。我认为这是问题所在:ansible-galaxy 没有扩展变量替换,无论是包含在 group_vars/all 还是环境中。使用 Ansible 版本 2.3.1.0 和 Python 2.7.10。

编辑 2:发现in the docsansible.cfg 中有一个指向另一个 Galaxy 实例的 server 选项,如下所示:

[galaxy]  
server=https://gitforsite1.ourdomain.com

Galaxy 确实使用此设置,它必须是完整的 Galaxy 网络应用程序,因为它调用 https://gitforsite1.ourdomain.com/api 。所以这对我也没有帮助。

最佳答案

当它们以 { 开头时,您应该引用与源关联的映射中的值。如果不是,yaml 解析器将尝试将该值解析为流式映射而不是标量:

- src: "{{ lookup('env', 'REPO_ROOT') }}/role1.git"
name: role1

由于您的标量中有单引号,没有双引号,也没有任何反斜杠 (\),因此我在标量周围使用了双引号。如果标量中没有单引号或者有任何反斜杠,则最好使用单引号。如果您有两种类型的引号,请使用单引号并将标量中的任何单引号加倍。以下将加载与上面相同的内容:

- src: '{{ lookup(''env'', ''REPO_ROOT'') }}/role1.git'
name: role1

关于bash - 我可以使用 ansible-galaxy 和 requirements.yml 的变量替换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44639308/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com