使用 Ansible 部署 InfluxDB
作者:Todd Persen / 产品
2015年11月17日
导航至
今天我们将介绍如何使用 Ansible 部署和配置 InfluxDB 时序数据库实例。
为什么选择 Ansible?
在众多配置管理工具中,为什么选择Ansible?至少对我来说,答案一直是简单。Ansible 是一个无代理的配置管理工具,也就是说,在开始之前不需要在目标机器上安装任何依赖。Ansible 使用广泛使用的、安全的通信协议 SSH(Secure Shell)来并行远程执行命令。这使得 Ansible 独特,唯一阻止您将 Ansible 的“任务”(或“剧本”)部署到任何服务器的因素只是一个 SSH 连接和 Ansible 本身(安装说明在这里)。Ansible 剧本还使用一种名为 YAML(JSON的超集)的数据序列化格式编写,因此您不必学习任何新语言即可开始。
为什么选择 InfluxDB?
InfluxDB 是一个零依赖的时序数据库,在易用性和功能之间取得了近乎完美的平衡。它支持 Erlang、Go、Haskell、Python、Java、PHP 等多种语言,因此很难找到不使用 InfluxDB 处理时序数据的原因。
入门指南
任何 Ansible 部署的基本构建块是“任务”文件。此文件列举了您希望 Ansible 执行以配置服务器的所有步骤。Ansible 还有一个名为“剧本”(类似于项目)的概念,但那超出了本文的范畴。
为了安装和配置 InfluxDB,我们需要执行以下步骤:
- 设置 InfluxDB 存储库
- 安装 InfluxDB
- 配置 InfluxDB
- (可选)任何必需的后配置步骤 - 这可能包括创建数据库、加载示例数据或在使用数据库之前所需的任何其他步骤。
- 在本篇文章的剩余部分,我们将假设我们使用的是 Ubuntu 14.04 服务器和 Ansible 版本 >= 1.6。我们将创建的任务/剧本可在此处下载。
设置 InfluxDB 存储库
首先,我们需要设置 InfluxDB 存储库,该存储库目前托管在repos.influxdata.com。将存储库添加到 APT 软件包管理器的第一步是添加来自包维护者的 GPG 签名密钥。这确保了软件包的安全性。此任务将如下所示:
- name: Import InfluxDB GPG signing key
apt_key: url=https://repos.influxdata.com/influxdb.key state=present
其中,-name
属性只是对这个任务应完成什么任务的简单人类可读声明。下面的 apt_key
是 Ansible 内置的 apt_key
模块的调用,该模块将 GPG 密钥添加到 Ubuntu 软件包管理器配置中。该模块接受两个参数:一个 url
字段(要添加的密钥的 URL)和一个 state
字段(任务完成后密钥的状态,在此例中为 present
,因为我们将其添加到当前配置中)。
添加 GPG 签名密钥后,我们还需要将存储库添加到我们的配置中。
- name: Add InfluxDB repository
apt_repository: repo='deb https://repos.influxdata.com/ubuntu trusty stable' state=present
在这里,我们声明我们希望使用https://repos.influxdata.com/ubuntu存储库(利用apt_repository
模块)。行尾的trusty
指的是当前Ubuntu版本的名称(Trusty Tahr),而stable
是指我们希望使用的软件包通道。InfluxDB存储库目前支持稳定和不稳定的软件包通道。
安装InfluxDB
既然我们的存储库已经添加到系统包管理器中,现在是安装InfluxDB的时候了。
- name: Install InfluxDB packages
apt: name=influxdb state=present
这一次我们使用的是apt
模块,其中name
指的是我们想要安装的包名,而state
指的是包的状态(present
表示如果已安装则不升级)。一旦上述任务完成,我们现在知道InfluxDB已成功安装。
配置和启动InfluxDB
既然我们已经安装了InfluxDB,让我们稍作配置。默认情况下,InfluxDB的主机名指向localhost
。让我们将其更改为
- name: Modify InfluxDB hostname
replace:
dest=/etc/opt/influxdb/influxdb.conf
regexp='hostname = "localhost"'
replace='hostname = "{{ ansible_hostname }}"'
backup=yes
在这里,我们使用replace
模块将InfluxDB配置文件中的所有hostname = "localhost"
字符串替换为新的和改进的hostname = "{{ ansible_hostname }}"
字符串,在运行时,{{ ansible_hostname }}
字符串将被转换为服务器的实际主机名(利用Jinja2的功能)。dest
表示我们想要修改的文件,通过使用backup=yes
标志,我们还确保了对当前配置的备份,以防万一出现问题。
等等,我们刚刚修改了配置而没有重启服务!新更改只有在服务重启后才会生效,所以现在让我们这么做
- name: Start the InfluxDB service
service: name=influxdb state=restarted
在这里,我们使用service
模块来重启InfluxDB服务。
注意:在每次运行时重启服务通常不是我们想要做的事情(尤其是如果配置没有变化的话)。我们只是在这个帖子中使用基本任务,但作为最佳实践,建议使用处理器来确保只有在配置更改时才执行服务重启。
加载一些测试数据
通过组合上述构建块,我们现在有一个完全功能的InfluxDB实例准备就绪。我们遗漏的一件事是在我们上面的列表中描述的配置后的步骤。虽然这并不是强制性的,但如果没有任何测试数据可供我们使用,那么一个崭新的InfluxDB实例就不那么令人兴奋了。让我们创建一个测试数据库并添加一些随机点。
- name: Create sample database
command: /opt/influxdb/influx -execute 'CREATE DATABASE sample_database'
- name: Load some test data into sample database
uri:
url: https://127.0.0.1:8086/write?db=sample_database
method: POST
body: "random_ints,host=server_{{ 10 | random }} value={{ 100 | random }}"
status_code: 204
with_sequence: start=1 end=10
上述内容留给读者自行理解。以下是几个开始链接
- 命令模块
- 使用Influx Shell
- uri模块
- with_sequence循环
- 随机过滤器
在我们可以运行新剧本之前,还有一个步骤:我们必须告诉Ansible要在哪个服务器上安装InfluxDB。为了做到这一点,我们需要创建一个‘inventory’文件。这个文件将简单地列出我们想要在哪个服务器上运行剧本的每个服务器。这会因环境而异,但将类似于以下内容
[email protected]
其中ubuntu
是您想要使用的用于身份验证的用户名,influxdb.mydomain.com
是您的服务器的DNS可解析的主机名(假设您已经有了SSH访问权限)。将此内容写入文件(例如hosts
),我们就可以开始了!
现在我们已经拥有了安装所需的所有部件,我们只需要将它们写入一个文件(例如 install-influxdb.yml)并让 Ansible 帮我们完成繁重的工作。具体的 shell 命令会因你的设置而异,但通常形式如下
$ ansible-playbook -i hosts install-influxdb.yml
如果一切按预期进行,你应该会看到以下类似的输出
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [influx1]
TASK: [Import InfluxDB GPG signing key] ***************************************
changed: [influx1]
TASK: [Add InfluxDB repository] ***********************************************
changed: [influx1]
TASK: [Install InfluxDB packages] *********************************************
changed: [influx1]
TASK: [Modify InfluxDB hostname] **********************************************
changed: [influx1]
TASK: [Start the InfluxDB service] ********************************************
changed: [influx1]
TASK: [Pause for InfluxDB service] ********************************************
(^C-c = continue early, ^C-a = abort)
[influx1]
Pausing for 3 seconds
ok: [influx1]
TASK: [Create sample database] ************************************************
changed: [influx1]
TASK: [Load some test data into sample database] ******************************
ok: [influx1] => (item=1)
ok: [influx1] => (item=2)
ok: [influx1] => (item=3)
ok: [influx1] => (item=4)
ok: [influx1] => (item=5)
ok: [influx1] => (item=6)
ok: [influx1] => (item=7)
ok: [influx1] => (item=8)
ok: [influx1] => (item=9)
ok: [influx1] => (item=10)
PLAY RECAP ********************************************************************
influx1 : ok=9 changed=6 unreachable=0 failed=0
注意:influx1
是我的本地 VM 的主机名,因此你应该看到不同的内容
现在你有一个完全功能性的(更重要的是,易于复制的)InfluxDB 实例,并有一些测试数据可以进行试验。运行此 Ansible Playbook 所使用的完整任务文件可在 此处 获取。