如何在具有Ansible的脚本中使用CloudFormation输出值

时间:2019-04-19 13:36:10

标签: ansible amazon-cloudformation

我正在尝试为学校项目设置一些自动化功能。要点是:

  • 通过CloudFormation安装EC2实例。然后
    • 使用cfn-init
      • 安装非常基本的Ansible配置
      • 从S3下载Ansible剧本
      • 运行所述剧本以通过CloudFormation安装Redshift集群
      • 安装一些必要的软件包
      • 安装一些必要的Python模块
      • 下载将要运行的Python脚本
      • 连接到Redshift数据库
      • 创建表格
      • 使用COPY命令将数据导入表中

这一切都可以执行脚本。手动执行此操作可以解决问题,但这是因为我可以将创建的Redshift端点复制到用于数据库连接的脚本中。我遇到的问题是,我不知道如何从CloudFormation中提取该输出值,因此无法将其插入脚本中以实现全自动(保存初始EC2部署)解决方案。

我看到Ansible至少有一种方法可以这样做(例如cloudformation_facts),但是我对如何实现它有点困惑。我看了一些示例,但还没有更清楚。没有上下文,我迷路了,到目前为止,我所看到的只是独立的片段。

1 个答案:

答案 0 :(得分:0)

为了确保列出答案:

我找出了describe-stacks cli命令的describe-stack-resourcesaws cloudformation子命令。使用这些,我能够找到所需的信息。特别是,我需要访问一个角色。这是我使用的命令:

aws cloudformation describe-stacks --stack-name=StackName --region=us-west-2 \ 
  --query 'Stacks[0].Outputs[?OutputKey==`RedshiftClusterEndpointAddress`].OutputValue' \
  --output text

我首先使用describe-stacks子命令来获取堆栈列表。相关堆栈是列表中的第一个(数组),因此我在查询顶部使用Stacks[0]来访问describe-stack-recources子命令。然后,我使用了Outputs,因为我对CloudFormation输出列表中的值感兴趣。我知道键的名称(RedshiftClusterEndpointAddress),因此我将其用作参数。然后,我使用OutputValue返回RedshiftClusterEndpointAddress的值。