1

我有一个 cloud-init bash 脚本,它从 S3 拉出一个 zip,解压缩它,然后运行其中包含的 Ansible 剧本。现在,我还将环境变量烘焙到/etc/environment中,并且 Ansible 剧本lookup('env')用来获取这些值。当以主用户或 root 身份通过 bash 运行时,它工作正常。但是当它通过 cloud-init 触发时,变量不会通过。

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

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

那行得通。有谁知道我如何才能避免将变量硬编码到剧本行中,并让它们按预期工作,即从中拉出/etc/environment

编辑:这里是云初始化:

#!/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 的用户数据部分。

4

1 回答 1

1

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

问题是在我的/etc/environment,我有它FOO=bar,它应该在哪里export FOO=bar。将所有值更改为使其工作。我在 cloud-init 函数中还有这source条线,但我认为现在已经解决了。

于 2015-11-20T21:53:19.393 回答