【发布时间】:2014-09-20 11:09:13
【问题描述】:
Consul 当前未以包管理器格式发布。有什么好的方法可以将它分布到多个系统并确保以一致的方式安装它?
【问题讨论】:
-
// ,我也有同样的问题,但从更一般的意义上说,如何将软件“打包”为存档中的二进制文件。我可以知道你在这个问题之前做了什么研究吗?
Consul 当前未以包管理器格式发布。有什么好的方法可以将它分布到多个系统并确保以一致的方式安装它?
【问题讨论】:
我发现您可以使用 fpm 从 consul 二进制文件轻松创建一个包:
fpm --verbose -s dir -t rpm -n consul -v 0.4 --url=http://consul.io --vendor=HashiCorp --description "A distributed service discovery tool" ./consul_/consul=/usr/local/bin/consul
该命令将在您当前的工作目录中创建一个 rpm 文件。您也可以使用带有 -t 标志的 'deb' 来创建 deb 包。
如果你还没有安装 fpm,你可以用 rubygems 安装它:
gem install fpm
FPM 需要创建您选择的包类型所需的工具,因此最好将其安装在类似的系统上(分别用于 RPM 和 DEB 的 Red Hat 或 Debain 变体)
【讨论】:
如果您对 Ubuntu 软件包感兴趣,我开始在 https://launchpad.net/~bcandrea/+archive/ubuntu/consul 维护 Launchpad PPA。它目前针对的是我需要的 LTS 版本 (12.04/14.04),但我也可能会考虑添加中间版本。
您可以按照通常的步骤安装它:
$ sudo apt-add-repository ppa:bcandrea/consul
$ sudo apt-get update
$ sudo apt-get install consul consul-web-ui
如果你想为它制作一个 Debian/Ubuntu 包并自己分发,你可能想看看我的 Makefile 来创建包:https://github.com/bcandrea/consul-deb。
【讨论】:
将其作为docker 容器交付。
Dockerfile 会:
Dockerfile 大概如下所示:
RUN wget 'https://dl.bintray.com/mitchellh/consul/0.3.1_linux_amd64.zip' -O consul.zip && unzip -d /usr/bin consul.zip
RUN mkdir -p /opt/consul/data /opt/consul/config
ADD consul.json /opt/consul/config/
VOLUME ["/opt/consul/data","/opt/consul/config"]
EXPOSE 8500
ENTRYPOINT ["/usr/bin/consul", "agent", "-config-dir=/opt/consul/config"]
CMD ["-server", "-bootstrap"]
【讨论】:
有一个 puppet 模块 (https://github.com/solarkennedy/puppet-consul) 可以帮助解决这个问题。它从dl.bintray.com 中提取二进制文件并帮助配置系统。
安装服务器,加入 172.20.20.10。我们“期待”一个 3 节点集群,所以这个 sn-p 将适用于所有三个服务器节点(即使是第一个,只要它是“172.20.20.10”副本)
class { 'consul':
join_cluster => '172.20.20.10',
config_hash => {
'datacenter' => 'dc1',
'data_dir' => '/opt/consul',
'log_level' => 'INFO',
'node_name' => $::hostname,
'bind_addr' => $::ipaddress_eth1,
'bootstrap_expect' => 3,
'server' => true,
}
}
sn-p 也适用于客户端代理(只需将“服务器”位翻转为 false。)最后一步是创建服务定义并将其注册到本地领事客户端代理:
consul::service { "foo",
tags => ['service'],
port => 8080,
check_script => '/opt/foo-health-checker.sh',
check_interval => '5s',
}
这是一个构建演示堆栈的示例 Vagrantfile,包含一个 3 节点 consul 集群:https://github.com/benschw/consul-cluster-puppet
...还有一篇介绍它是如何构建的博客文章:http://txt.fliglio.com/2014/10/consul-with-puppet/
【讨论】:
另一种选择是重用the existing docker images 之一。
例如progrium/consul 是一个伟大的容器,旨在在 Docker 生态系统中工作
【讨论】:
consul 是一个单一的二进制文件,非常适合轻松(重新)分发和处理。 打包为 .deb 只是一个带 fpm 的三行代码。
先决条件:用gem install fpm安装fpm
consul 0.6 的完整工作示例(截至 2016 年 1 月的当前版本):
wget -N https://releases.hashicorp.com/consul/0.6.0/consul_0.6.0_linux_amd64.zip
unzip -o consul_0.6.0_linux_amd64.zip
fpm --force --verbose -s dir -t deb -n consul -v 0.6 \
--url=http://consul.io --vendor=HashiCorp \
--description "A distributed service discovery tool" ./consul=/usr/local/bin/consul
【讨论】:
另一种选择,它只假设 linux 目标机器运行 ssh 守护进程,并且您可以从源机器使用密钥进行 ssh:
可以在源机器上安装Ansible,然后使用http://docs.ansible.com/ansible/latest/intro_adhoc.html#file-transfer中描述的简单命令行
文件传输 这是 /usr/bin/ansible 的另一个用例 命令行。 Ansible 可以将大量文件 SCP 到多台机器 并行。
将文件直接传输到多个服务器:
$ ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"
假设您已经拥有所需的文件consul,请准备一个包含目标计算机列表的文件。这在 ansible 行话中称为 inventory - http://docs.ansible.com/ansible/latest/intro_inventory.html
然后ansible my_linux_machines -m copy -a "src=consul dest=/usr/bin/consul"
你也可以用ansible下载压缩包,解压然后复制。搜索“可解压”
【讨论】:
有一个多平台的 Ansible 角色可以帮助创建带有客户端的 Consul 集群:
https://github.com/brianshumate/ansible-consul
他的另一个角色可以在 Consul 之上添加 Vault。
【讨论】: