【问题标题】:Retrieve public IP of another EC2 instance in Saltstack formula在 Saltstack 公式中检索另一个 EC2 实例的公共 IP
【发布时间】:2015-10-15 17:14:50
【问题描述】:

我正在使用 Cloudformation 设置 VPN 节点并使用 Saltstack 配置它们。我们称它们为左右节点。配置左节点时,我需要知道右节点的公共 IP,反之亦然。有没有办法在 Saltstack 公式中检索另一个 EC2 实例的 IP?两个实例都有与之关联的标签。

或者有其他方法可以实现这一点吗?我只想省略任何硬编码。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 salt-stack amazon-cloudformation


    【解决方案1】:

    使用 Salt 执行此操作的独立于云提供商的方法是使用 Salt Mine。在这里,master 收集 minions 的信息(例如关于 IP 地址的信息)并使它们可用于其他 minions。 This link has an example for a load balancer configuration.

    此设置要求您运行 Salt Master(无主设置在此处不起作用)。如果所有节点都可能想知道所有其他节点的 IP 地址,您要么需要在知道所有 IP 地址后再次运行 Salt 配置,要么使用 Salt Orchestrate 确保首先收集所有 minion 的颗粒,然后服务已安装。

    如果您希望 IP 地址定期更改,或者如果您计划使用定期进出的 IP 地址(临时节点)扩展您的基础架构,Salt 会推荐 Salt Reactor,但我认为 Consul(见下文)可能是根据您的情况,设置起来要简单得多。

    对于Consul,您将在每个节点上安装一个代理,并以直接的 Salt 方式在本地注册每个节点的服务。 Consul 可以为您提供节点和服务的 DNS 解析。使用Consul Template,一旦 IP 地址更改或节点出现,它将重新编写您的配置并重新加载您的服务。你需要有一个领事大师才能完成这项工作。 Consul online documentation 相当不错。我还写了一个Consul/Salt/Cloud Tutorial,你可能会感兴趣。

    【讨论】:

      【解决方案2】:

      您可以将 Saltstack shell 输出到命令行以使用 aws 命令行工具吗?我们在 Chef 中一直这样做是为了根据标签获取对其他资源的引用。

      您希望为执行调用的 EC2 实例提供一个 IAM 角色,该角色有权调用 ec2:DescribeInstances 操作:

      {
        "Version": "2012-10-17",
        "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "ec2:DescribeInstances"
              ],
              "Resource": [
                  "*"
              ]
          }
        ]
      }
      

      那么你只需要在Salt中添加一些东西来根据标签获取实例信息:

      aws --region us-east-1 ec2 describe-instances --filter Name=tag:MyTagKey,Values=MyTagValue --query Reservations[0].Instances[0].PublicIpAddress
      

      请小心,因为您希望每个节点都了解另一个节点(循环依赖),因此您可能会遇到竞争条件。您必须想办法人为地延迟每次 Salt 运行,直到两个实例都使用公共 IP 运行。

      【讨论】:

        猜你喜欢
        • 2018-01-02
        • 2023-03-03
        • 2016-04-16
        • 2016-12-02
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多