如何通过 cloud-init 将环境变量放入 Ansible 脚本 运行?

How to get environment variables into Ansible script run by cloud-init?

我有一个 cloud-init bash 脚本,它从 S3 中提取一个 zip,解压它,然后 运行s 一个包含在其中的 Ansible 剧本。现在,我还将环境变量嵌入到 /etc/environment 中,而 Ansible 剧本使用 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 中的用户数据部分。

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

问题是在我的 /etc/environment 中,我的 FOO=bar 应该是 export FOO=bar。将所有的值都改成这样就可以了。我在 cloud-init 函数中仍然有 source 行,但我认为现在已经解决了。