如何通过 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
行,但我认为现在已经解决了。
我有一个 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
行,但我认为现在已经解决了。