在 Saltstack 公式中检索另一个 EC2 实例的 public IP

Retrieve public IP of another EC2 instance in Saltstack formula

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

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

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

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

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

那你只需要在Salt中加点东西就可以shell出来根据tag得到实例信息:

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

请注意,听起来您希望每个节点都了解另一个节点(循环依赖),因此您可能会遇到竞争条件。您必须找到一种方法来人为地延迟每个 Salt 运行,直到两个实例都是 运行 public IP 之后。

使用 Salt 执行此操作的独立于云提供商的方法是使用 Salt Mine. Here a master collects the information of the minions (for example about IP addresses) and makes them available for other minions. This link has an example for a load balancer configuration

此设置要求您有一个 Salt Master 运行ning(无主设置在这里不起作用)。如果所有节点都可能想知道所有其他节点的 IP 地址,您将需要 运行 在所有 IP 地址已知后第二次配置 Salt,或者使用 Salt Orchestrate 确保首先所有 minion 的 grains收集,然后安装服务。

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

对于 Consul you will install an agent on each node and register each node's services locally in a straight-forward Salt manner. Consul can provide you DNS resolving for the nodes and services. With Consul Template it will re-write your configurations and reload your services once IP addresses change or nodes are coming up. You will need to have a Consul master to make this work. The Consul online documentation is quite good. I have also written a Consul/Salt/Cloud Tutorial 您可能会感兴趣。