1

我有一个cloud-init bash脚本,它从S3拉取一个zip文件,解压缩它,然后运行一个包含在其中的Ansible操作手册。现在,我还有环境变量烘焙到/etc/environment,Ansible playbook使用lookup('env')来获取这些值。当通过bash运行时,它可以正常工作,既可以作为主用户,也可以作为根用户运行但是当它通过cloud-init启动时,变量不会通过。如何将环境变量导入由cloud-init运行的Ansible脚本?

在我的bash脚本中,第一行是source /etc/environment,我可以很好地回应它们。只有当Ansible playbook执行lookup时,它才会失败。有趣的是,我可以强制变量像这样:

FOO=$FOO BAR=$BAR ansible-playbook -c local ...

和工程。有没有人有任何想法我可以解决如何将变量硬编码到剧本中,并让它们按预期工作,即从/etc/environment拉出?

编辑:这里的云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

你可以分享你的云启动脚本吗? – ydaetskcoR

+0

@ydaetskcoR,我在上面添加了它。谢谢! – greggilbert

+0

如果将'source'放入'doit'中,会发生什么? (我认为这是一个'出口'问题。) –

回答

1

好的,所以我想通了。 lookup()在下面使用os.getenv,我发现其他一些与os.getenv有关的问题没有正确返回。

问题是,在我的/etc/environment,我把它作为FOO=bar,它应该是export FOO=bar。将所有值更改为可以使其工作。我在云初始化函数中仍然有source行,但我认为现在已经解决了。

相关问题