如何将环境变量导入由cloud-init运行的Ansible脚本?

时间:2015-11-20 05:53:05

标签: bash amazon-web-services ansible ansible-playbook cloud-init

我有一个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中的“用户数据”部分。

1 个答案:

答案 0 :(得分:1)

好的,所以我明白了。 lookup()使用下面的os.getenv,我发现了一些与os.getenv无法正常返回相关的其他问题。

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