我正在使用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>
答案 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
包来探索使用哪个地址的其他选项。