在Consul JSON文件中生成-bind参数以与Marathon一起使用

时间:2016-12-20 03:14:13

标签: bash docker marathon consul

我正在使用Marathon在docker上启动Consul容器,我遇到了一个关于创建JSON文件的主观问题。

目前我计划使用此格式的JSON文件启动容器

服务器-1.json

{
      "id": "consul-server-2",
      "cmd": "consul agent -server -client=0.0.0.0 -ui -bind=100.10.30.40 -retry-join=server-1.local -data-dir=/tmp/consul",
      "cpus": 1,
      "mem": 512.0,
      "instances": 1,
      "container": {
        "type": "DOCKER",
        "docker": {
          "image": "consul:latest",
          "name": "dev-consul",
          "network": "HOST"
        }
      },
      "constraints": [
        [
          "hostname",
          "CLUSTER",
          "server-1.local"
        ]
      ]
}

我需要能够更改每个JSON文件的-bind地址,并且我计划在BASH中使用heredocs,但我不确定是否有更好的实践,以便于创建这些类型的文件的可维护性。

理想情况下,我希望在Consul或Marathon中有一个字段可以自动给我一个特定端口的IP地址来提供给-bind但是因为我有多个私有IP,所以我需要手动配置它。 / p>

2 个答案:

答案 0 :(得分:0)

听起来您有配置管理问题。 如果我理解正确,你在内部网络中有许多服务器,每个服务器都有一个内部IP地址,你现在想为每个服务器生成正确的服务文件。

通常,您会使用配置管理系统,例如: Ansible,Chef或Puppet来解决这个问题。

就个人而言,我可以推荐Ansible,因为它很容易上手并且开销很低。

要解决您的问题,您首先要创建一个包含服务器IP地址的清单文件,然后为您的服务文件创建一个Jinja2模板。 然后,您可以为该模板中的每个服务器使用正确的IP地址,最后使用Ansible部署所有文件。

答案 1 :(得分:0)

查看consul 0.7.2或更新版本。 Consul中有一个即将记录的功能,允许运行时配置IP地址。除非运行net=host,否则我建议不要在容器中运行Consul,而是使用上面的配置代码段:

{
          "id": "consul-server-2",
          "cmd": "consul agent -server -client='{{ GetPrivateIP }}' -ui -bind=100.10.30.40 -retry-join=server-1.local -data-dir=/tmp/consul",
          "cpus": 1,
          "mem": 512.0,
          "instances": 1,
          "container": {
            "type": "DOCKER",
            "docker": {
              "image": "consul:latest",
              "name": "dev-consul",
              "network": "HOST"
            }
          },
          "constraints": [
            [
              "hostname",
              "CLUSTER",
              "server-1.local"
            ]
          ]
        }

可以根据hashicorp/go-sockaddr包来探索使用哪个地址的其他选项。