我有一个cloud-init bash脚本,它从S3中拉出一个zip,解压缩,然后运行其中包含的Ansible playbook。现在,我还将环境变量烘焙到/etc/environment
,而Ansible playbook使用lookup('env')
来获取这些值。它通过bash运行时可以正常工作,无论是作为主用户还是作为root用户。但是当它通过cloud-init触发时,变量不会通过。
在我的bash脚本中,第一行是source /etc/environment
,我可以很好地回应它们。只有当Ansible剧本的lookup
失败时才会这样。有趣的是,我可以强制变量:
FOO=$FOO BAR=$BAR ansible-playbook -c local ...
这是有效的。有没有人知道我如何能够将变量硬编码到剧本行中,并让它们按预期工作,即从/etc/environment
拉出来?
编辑:这是cloud-init:
#!/bin/bash
source /etc/environment
doit() {
aws s3 cp s3://my/scripts/dev-s3-push.tar.gz /tmp/my.tar.gz
mkdir -p /app/deploy
tar -C /app/deploy -zxvf /tmp/my.tar.gz
cd /app/deploy
FOO=$FOO BAR=$BAR ansible-playbook -i "localhost," -c local run.yml
}
doit
这已添加到AWS中的“用户数据”部分。
答案 0 :(得分:1)
好的,所以我明白了。 lookup()
使用下面的os.getenv
,我发现了一些与os.getenv
无法正常返回相关的其他问题。
问题在于,在我的/etc/environment
中,我将其作为FOO=bar
,它应该是export FOO=bar
。将所有值更改为可以使其工作。我仍然在cloud-init函数中有source
行,但我认为现在已经解决了这个问题。