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

时间:2017-06-19 20:22:50

标签: bash ansible yaml substitution

我们有许多Ansible角色的私人git回购。回购主机因站点而异,例如:

  • Site1使用string1='key1=value1' KEY=$(echo $string1 | cut -f1 -d=) VALUE=$(echo $string1 | cut -f2 -d=)
  • Site2使用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 。所以这对我也没有帮助。

3 个答案:

答案 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

此示例实现了在互联网中断的情况下它将安装下一个相同的角色。

一旦安装了相同角色之一,将跳过相同角色的安装。

当然,您可以更改所需角色的顺序。