我们有许多Ansible角色的私人git回购。回购主机因站点而异,例如:
string1='key1=value1'
KEY=$(echo $string1 | cut -f1 -d=)
VALUE=$(echo $string1 | cut -f2 -d=)
https://gitforsite1.ourdomain.com
我想要的是拥有一个https://gitforsite2.ourdomain.com
文件并替换正确的git repo。我可以这样做的一种方法是让bash脚本设置一个环境变量:
requirements.yml
然后将此值替换为#!/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
表明文件结构不正确。 (这可能是方法有效,我的语法错误。)
任何让我设置变量(环境,命令行,无论如何)的方法都可以。或者,如果不支持,我是否需要在运行时重写ERROR! Unable to load data from the requirements file
文件,可能使用requirements.yml
?
编辑1:
在上面的bash脚本摘录中添加了sed
行,以显示如何使用ansible-galaxy
文件。我认为这就是问题所在:requirements.yml
不会扩展变量替换,无论是包含在ansible-galaxy
还是环境中。使用Ansible版本2.3.1.0和Python 2.7.10。
编辑2:
已发现in the docs有一个group_vars/all
选项指向server
中的另一个Galaxy实例,如下所示:
ansible.cfg
Galaxy 使用此设置但它必须是完整的Galaxy网络应用,因为它会调用[galaxy]
server=https://gitforsite1.ourdomain.com
。所以这对我也没有帮助。
答案 0 :(得分:2)
当它们以{
开头时,您应引用与source关联的映射中的值。如果不是,yaml解析器将尝试将该值解析为流式样式而不是标量:
- src: "{{ lookup('env', 'REPO_ROOT') }}/role1.git"
name: role1
由于标量中有单引号且没有双引号,也没有任何反斜杠(\
),因此我在标量周围使用了双引号。如果标量中没有单引号或者有任何反斜杠,则最好使用单引号。如果您有两种类型的引号,请使用单引号并将标记中的任何单引号加上。以下将加载与上面相同的内容:
- src: '{{ lookup(''env'', ''REPO_ROOT'') }}/role1.git'
name: role1
答案 1 :(得分:0)
如果你这样做会怎么样:
#!/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 -s ${REPO_ROOT}
然后在requirements.yml中替换此值:
---
- src: role1.git
name: role1
- src: role.git
name: role2
答案 2 :(得分:0)
我有一个解决方法。如果您不介意执行时间,请参阅:
- name: geerlingguy.docker
- name: geerlingguy.docker
src: https://my-private-server-1/path/is/not/important/docker.tar.gz
- name: geerlingguy.docker
src: https://my-private-server-2/path/is/not/important/docker.tar.gz
并执行像这样的ansible-galaxy:
$ ansible-galaxy install --ignore-errors -r requirements.git-cache.yml
此示例实现了在互联网中断的情况下它将安装下一个相同的角色。
一旦安装了相同角色之一,将跳过相同角色的安装。
当然,您可以更改所需角色的顺序。