使用 Ansible 部署 InfluxDB
作者:Todd Persen / 产品
2015 年 11 月 17 日
导航至
今天我们将介绍如何使用 Ansible 部署和配置时间序列数据库 InfluxDB 的实例。
为什么选择 Ansible?
在所有配置管理工具中,为什么要使用 Ansible?答案,至少对我而言,始终是简单性。Ansible 是一种“无代理”配置管理工具,也就是说,在开始之前,它不需要在目标机器上安装任何依赖项。Ansible 使用广泛使用的安全通信协议 SSH(安全外壳)来并行远程执行命令。这使得 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。我们将要创建的任务/剧本可在此处下载 here。
设置 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
模块将 hostname = "localhost"
字符串的所有实例替换为新的和改进的 hostname = "{{ ansible_hostname }}"
字符串(在 InfluxDB 配置中),其中在运行时,{{ ansible_hostname }}
字符串将转换为您服务器的真实主机名(利用 Jinja2 的强大功能)。dest
表示我们想要修改的文件,通过使用 backup=yes
标志,我们还可以确保对当前配置进行备份,以防发生任何意外。
等等,我们刚刚修改了配置而没有重启服务!新更改只有在服务重启后才会生效,所以现在让我们这样做
- name: Start the InfluxDB service
service: name=influxdb state=restarted
在这里,我们使用 service
模块重启 InfluxDB 服务。
注意:通常我们不希望在每次运行时都重启服务(尤其是在配置甚至没有更改的情况下)。我们只是为这篇文章使用基本任务,但是,作为最佳实践,建议使用 Handler 以确保仅在配置更改时才执行服务重启。
加载一些测试数据
通过结合上述构建块,我们现在拥有一个功能齐全的 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://localhost: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
以上内容留给读者自行解读。以下是一些链接供您入门
- command 模块
- 使用 Influx Shell
- uri 模块
- with_sequence 循环
- random 过滤器
在我们可以运行新剧本之前,还有最后一步:我们必须告诉 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 剧本的完整任务文件可在此处获得 here。