繁体   English   中英

将 gitlab-ci 文件中的 bash 变量作为额外参数传递给 ansible 作业

[英]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. 所以我就这么做了。

  1. 我试图通过将它们作为 bash 变量存储在.gitlab-ci.yml文件中来传递这些值:
- chmod +x ${CI_PROJECT_DIR}/scripts/resolve_idm_dev.py
- idm_ips=`python3 ${CI_PROJECT_DIR}/scripts/resolve_idm_dev.py`
  1. 最后将此变量作为额外参数传递给 ansible:
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM