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

时间:2015-10-14 16:47:49

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

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

或者有不同的方法来实现这一目标吗?我只想省略任何硬编码。

2 个答案:

答案 0 :(得分:2)

使用Salt的云提供商独立方式是使用Salt Mine。在这里,主人收集小兵的信息(例如关于IP地址)并使其可供其他小兵使用。 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 master来完成这项工作。 Consul online documentation非常好。我还写了一篇Consul/Salt/Cloud Tutorial,你可能会感兴趣。

答案 1 :(得分:1)

你可以在命令行中使用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运行。