【问题标题】:use local env to replace variables in cloudformation template使用本地环境替换 cloudformation 模板中的变量
【发布时间】:2019-09-05 01:27:26
【问题描述】:

我想在 cloudformation 模板的用户数据中替换一些变量,我不想将这些变量作为参数放在 cloudformation 中。 我怎样才能做到这一点? 似乎 cloudformation 希望始终包含任何需要替换为参数的变量,但我觉得这不够灵活。所以不确定其他人是否已经找到了一种方法来做到这一点。

某些变量实际上并不需要与基础架构绑定,但需要动态替换这些变量。

例如我有这个用户数据

UserData:
        "Fn::Base64":
          !Sub |
            #!/bin/bash -xe

            cat >> /tmp/docker_compose.yaml  << EOF
            version: '3.5'
            services:
               ngnix:
                 container_name: nginx
                 image: nginx:$TAG
                 restart: always
                 ports:
                  - 80:80
                 environment:
                    SERVER_ID: $SERVER_ID
                    AWS_REGION: $AWS_REGION 
            EOF

我想在运行 cloudformation 命令的机器上设置环境变量值

export TAG=1.9.9
export SERVER_ID=12
export AWS_REGION=us-east-1

如何在不将这些变量作为参数的情况下使用这些本地环境值在用户数据中进行替换。我已经尝试了所有我能想到的,但我做不到。

如果有人想出办法或破解,所以想利用互联网的力量。

谢谢

【问题讨论】:

  • 这就是像 Ansible 这样的部署工具派上用场的地方,您可以在 cloudformation 之外存储变量并让 Ansible 替换变量。你宁愿在 bash 中这样做吗?
  • 我知道 ansible,但我现在更专注于 cloudformation..我非常了解 ansible...bash 正在使用类似 sed?或者你有什么想法?
  • 变量究竟来自哪个环境?它们是否在堆栈“外部”,例如在从模板开始创建堆栈的机器上?还是别的地方?

标签: amazon-ec2 amazon-cloudformation user-data


【解决方案1】:

这是通过脚本执行此操作的一种方法,在某些情况下此脚本可能会出现问题,但您必须测试并查看。

我不希望环境变量在准备我的 cloudformation 脚本之外可用 - 所以我已经在一个脚本文件中完成了所有工作;加载环境变量和替换。

注意:您需要在您的机器上安装 envsubst。

我有 3 个文件要开始: 文件一是我的 cloudformation 脚本,其中我的每个参数都有一个默认值,表示为 bash 变量:

cloudformation.yaml

Region
  Default: $Region

InstanceType
  Default: $InstanceType

Colour:
  Default: $Colour

然后我有我的变量文件:

variables.txt

InstanceType=t2.micro
Colour=Blue
Region=eu-west-1

然后我有我的脚本来进行替换:

script.sh

#!/bin/bash
source variables.txt
export $(cut -d= -f1 variables.txt)

cat cloudformation.yaml | envsubst > subs_cloudformation.yaml

这是我文件夹的内容:

cloudformation.yaml    script.sh     variables.txt

我确保我的 script.sh 具有正确的权限:

chmod +x script.sh

然后运行我的脚本:

./script.sh

我的文件夹的内容现在是:

cloudformation.yaml     script.sh     variables.txt     subs_cloudformation.yaml

如果我查看 subs_cloudformation.yaml 文件的内容:

Region
  Default: eu-west-1

InstanceType
  Default: t2.micro

Colour:
  Default: Blue

我现在可以运行该 cloudformation 脚本,cloudformation 会将这些默认值替换到我的模板中 - 所以我们对上述脚本所做的只是为 cloudformation 提供默认值。

我当然只是给出了 cloudformation 模板的 sn-p,您可以通过使用 dev.txt、qa.txt、production.txt 变量文件并替换其中的任何一个来进一步改进它。

编辑:你的变量在文件中的哪个位置并不重要,所以它可以在用户数据或参数中作为默认值..没关系。您还需要小心,这不会检查您的 cloudformation 文件中的每个变量是否都有匹配的环境变量。如果它不在您的变量文件中,则替换的值将为空。

【讨论】:

  • 我不想安装任何东西或有一些特殊的先决条件..我可以轻松使用sed 但只是想检查一下是否有一些我不知道的 cloudformation 功能..如果这不是本机可能的话只会使用sed之类的东西
  • 好的 - 建议对您的问题进行编辑,因为您没有声明您不想安装任何应用程序或软件包,或者您知道如何使用 sed 并正在寻找替代方案跨度>
  • 另外,检查 envsubst 是否尚未安装在您的系统上。我知道它在某些 linux 系统上。
猜你喜欢
  • 2018-04-30
  • 1970-01-01
  • 2021-11-05
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多