将数组或字典作为额外参数从gitlab传递给ansible



我正试图将一个列表或字典列表从gitlab传递给ansible。我使用gitlab锚点是因为在不同的工作中,列表会有不同的值。这是我使用的锚

.generic_deploy: &generic_deploy 
"sudo ansible-playbook -b my-ansible.yml --user $SSH_USR 
-e deploymentEnvironment=${deploymentEnvironment} 
-e domains=${domains}"

在my-ansible.yml中,有一个创建模板的任务,如下所示:

- name: Creating Gson from Template
template:
src: mytemplate.json.j2
dest: /opt/mypath/my.json

然后在mytemplate.json.j2中有一个这样的结构:

{
"id": "/{{ deploymentEnvironment }}/myapp",
"apps": [
{% for domain in domains %}
{
"id": "{{ loop.index }}",
"constraints": [
[
"zone",
"CLUSTER",
"GATEWAY_{{ loop.index }}_{{ loop.index }}"
]
]
}
{%- if not loop.last %},{% endif %}
{% endfor %}
}

我测试了将列表传递给Ansible的不同方法,这里有一个示例

deploy-featurebranch:
variables:
deploymentEnvironment: "devtest"
domains: "['A1','A2','D1','D3','D5']"
stage: deploy
script:
- *generic_deploy
when: manual

我注意到我不允许在列表中有这样的空间";[‘A1’、‘A2’、‘D1’、‘D3’、‘D5’]";。如果我在逗号后使用空格,那么Ansible会给我错误的论点。如果我在没有空格的情况下执行此操作,那么我将获得一个字符串作为变量,因此loop.index的数量将与字符串长度一样多。知道怎么做吗?

我可以通过简单的工作来解决这个问题,将对我有效的解决方案放在这里:gitlab-ci.yml文件

.generic_deploy: &generic_deploy 
"sudo ansible-playbook -b my-ansible.yml --user $SSH_USR 
-e deploymentEnvironment=${deploymentEnvironment} 
-e "${domains}"
deploy-featurebranch:
variables:
deploymentEnvironment: "devtest"
domains: "{'domains': [{'name':'A1','zone':'A'},{'name':'A2','zone':'A'},{'name':'D1','zone':'D'},{'name':'D3','zone':'D'},{'name':'D5','zone':'D'}]}"
stage: deploy
script:
- *generic_deploy
when: manual

mytemplate.json.j2文件

{
"id": "/{{ deploymentEnvironment }}/myapp",
"apps": [
{% for domain in domains %}
{
"id": "{{ domain.name|lower }}",
"constraints": [
[
"zone",
"CLUSTER",
"{{ domain.zone }}"
]
]
}
{%- if not loop.last %},{% endif %}
{% endfor %}
}

在我的案例中,json文件用于部署到Marathon,应用程序id应该是小写的。

最新更新