[英]Passing bash variable from gitlab-ci file as an extra argument to ansible job
我有以下问题。 我想将解析的 IP 地址传递给这个 j2 模板文件:
COMMIT
# NAT table
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 636 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination {{ idm_ips[0] }}
-A PREROUTING -p tcp -m tcp --dport 636 -j DNAT --to-destination {{ idm_ips[1] }}
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
所以我的变量是idm_ips[0]
和idm_ips[1]
。 它们在ansible-vars.yaml
文件中静态设置:
idm_ips:
- "192.168.10.25"
- "192.168.10.42"
现在我必须动态地将 FQDN 解析为 idm_ips,所以我编写了一个简单的 python 脚本:
#!/usr/bin/env python3
import socket
import json
ldap_dev = 'ldap.organisation.com'
resolved = socket.gethostbyname_ex(ldap_dev)
ips_arr = resolved[2]
idm_ips_json = json.dumps(ips_arr)
print(idm_ips_json)
This array of IPs is in JSON format, because I read on SO that if I want to pass a bash array as an extra argument to ansible job, it has to be JSON. 所以我就这么做了。
.gitlab-ci.yml
文件中来传递这些值:- chmod +x ${CI_PROJECT_DIR}/scripts/resolve_idm_dev.py
- idm_ips=`python3 ${CI_PROJECT_DIR}/scripts/resolve_idm_dev.py`
ansible-playbook ${CI_PROJECT_DIR}/ansible/provision.yml --extra-vars "project_path=${CI_PROJECT_DIR} project_environment=${CI_ENVIRONMENT_NAME} '{"idm_ips": ${idm_ips}}'"
我正在为此苦苦挣扎,因为当我尝试构建我的环境时,我遇到了一个错误:
fatal: [kibana-development]: FAILED! => changed=false
msg: 'AnsibleUndefinedVariable: ''idm_ips'' is undefined'
我究竟做错了什么? 有好心人能指点我怎么办吗? 抱歉描述模糊。
首先,告诉 python 转义[
, ]
因为它们在 SHELL 中具有特殊含义:
>>> print(json.dumps(socket.gethostbyname_ex("stackoverflow.com")[2]).replace("[","\\[").replace("]","\\]"))
\["151.101.193.69", "151.101.129.69", "151.101.1.69", "151.101.65.69"\]
二、妥善处理JSON
:
ansible-playbook ${CI_PROJECT_DIR}/ansible/provision.yml \
-e "project_path=${CI_PROJECT_DIR} \
-e project_environment=${CI_ENVIRONMENT_NAME} \
-e '{"idm_ips":' "${idm_ips}"'}'
如果这不起作用,请考虑将idm_ips_json
输出到文件并将其传递给:
... -e @yourfile. # because working with json in the shell is terrible ..
请注意,如果您选择使用文件,则内容应为:
{"idm_ips": ["192.X.Z.Y", "192."...]}
不幸的是,这两个都失败了。 还是同样的问题:
msg: 'AnsibleUndefinedVariable: ''idm_ips'' is undefined'
编辑:
我想知道这个额外的变量是否被传递了,因为我一直都有同样的错误。 看起来它以某种方式被忽略了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.