Skip to content

InfluxDB Ansible 自动化部署脚本

InfluxDB Ansible 自动化部署脚本可以帮助用户快速、高效地部署和管理 InfluxDB 集群,减少手动操作的错误,提高部署效率和一致性。本文将详细介绍 InfluxDB Ansible 自动化部署脚本的编写方法和最佳实践。

Ansible 环境准备

安装 Ansible

在控制节点安装 Ansible

bash
# 在 Ubuntu/Debian 上安装
apt update && apt install -y ansible

# 在 CentOS/RHEL 上安装
yum install -y epel-release
yum install -y ansible

# 使用 pip 安装
pip install ansible

验证 Ansible 安装

bash
ansible --version

配置 Ansible inventory

创建 Ansible inventory 文件,定义 InfluxDB 集群节点:

ini
# inventory.ini
[influxdb_servers]
server1 ansible_host=192.168.1.101 ansible_user=root
server2 ansible_host=192.168.1.102 ansible_user=root
server3 ansible_host=192.168.1.103 ansible_user=root

[influxdb_masters]
server1 ansible_host=192.168.1.101 ansible_user=root

[influxdb_slaves]
server2 ansible_host=192.168.1.102 ansible_user=root
server3 ansible_host=192.168.1.103 ansible_user=root

[influxdb_cluster:children]
influxdb_masters
influxdb_slaves

配置 SSH 免密码登录

bash
# 生成 SSH 密钥
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa

# 复制 SSH 密钥到所有节点
ansible all -i inventory.ini -m authorized_key -a "user=root key={{ lookup('file', '~/.ssh/id_rsa.pub') }}" --ask-pass

InfluxDB 基础部署剧本

目录结构流程图

主剧本文件

yaml
# playbooks/influxdb-install.yml
# 安装并配置 InfluxDB 的主剧本
---
- name: 安装并配置 InfluxDB
  hosts: influxdb_cluster  # 目标主机组
  become: yes  # 使用 sudo 权限
  roles:
    - influxdb  # 使用 influxdb 角色
  tags:
    - install  # 安装标签
    - configure  # 配置标签

角色任务文件

主任务文件

yaml
# roles/influxdb/tasks/main.yml
# 主任务文件,导入其他任务文件
---
- import_tasks: install.yml  # 导入安装任务
- import_tasks: configure.yml  # 导入配置任务
- import_tasks: service.yml  # 导入服务管理任务
- import_tasks: verify.yml  # 导入验证任务

安装任务文件

yaml
# roles/influxdb/tasks/install.yml
# InfluxDB 安装任务文件
---
# 在 Debian/Ubuntu 系统上添加 InfluxDB 仓库密钥
- name: 添加 InfluxDB 仓库密钥
  apt_key:
    url: https://repos.influxdata.com/influxdb.key
    state: present
  when: ansible_os_family == "Debian"

# 在 Debian/Ubuntu 系统上添加 InfluxDB 仓库
- name: 添加 InfluxDB 仓库
  apt_repository:
    repo: deb https://repos.influxdata.com/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable
    state: present
    filename: influxdb
  when: ansible_os_family == "Debian"

# 在 Debian/Ubuntu 系统上安装 InfluxDB
- name: 在 Debian/Ubuntu 上安装 InfluxDB
  apt:
    name: influxdb
    state: present
    update_cache: yes
  when: ansible_os_family == "Debian"

# 在 CentOS/RHEL 系统上添加 InfluxDB 仓库
- name: 在 CentOS/RHEL 上添加 InfluxDB 仓库
  yum_repository:
    name: influxdb
    description: InfluxDB Repository - RHEL $releasever
    baseurl: https://repos.influxdata.com/rhel/$releasever/$basearch/stable
    gpgcheck: yes
    gpgkey: https://repos.influxdata.com/influxdb.key
    enabled: yes
  when: ansible_os_family == "RedHat"

# 在 CentOS/RHEL 系统上安装 InfluxDB
- name: 在 CentOS/RHEL 上安装 InfluxDB
  yum:
    name: influxdb
    state: present
  when: ansible_os_family == "RedHat"

配置任务文件

yaml
# roles/influxdb/tasks/configure.yml
# InfluxDB 配置任务文件
---
# 创建 InfluxDB 配置目录
- name: 创建 InfluxDB 配置目录
  file:
    path: /etc/influxdb
    state: directory
    mode: 0755

# 复制 InfluxDB 配置文件模板到目标主机
- name: 复制 InfluxDB 配置文件
  template:
    src: influxdb.conf.j2
    dest: /etc/influxdb/influxdb.conf
    owner: influxdb
    group: influxdb
    mode: 0644
  notify: restart influxdb  # 配置变更时重启服务

# 创建 InfluxDB 数据目录
- name: 创建 InfluxDB 数据目录
  file:
    path: "{{ item }}"
    state: directory
    owner: influxdb
    group: influxdb
    mode: 0755
  loop:
    - /var/lib/influxdb/data  # 主数据目录
    - /var/lib/influxdb/wal  # WAL 日志目录
    - /var/lib/influxdb/meta  # 元数据目录

服务任务文件

yaml
# roles/influxdb/tasks/service.yml
# InfluxDB 服务管理任务文件
---
# 启动并启用 InfluxDB 服务
- name: 启动并启用 InfluxDB 服务
  service:
    name: influxdb
    state: started  # 确保服务正在运行
    enabled: yes  # 设置开机自启

验证任务文件

yaml
# roles/influxdb/tasks/verify.yml
# InfluxDB 验证任务文件
---
# 等待 InfluxDB 服务启动
- name: 等待 InfluxDB 启动
  wait_for:
    port: 8086  # 监听端口
    delay: 5  # 延迟 5 秒开始检查
    timeout: 30  # 超时时间 30 秒

# 验证 InfluxDB API 可用性
- name: 验证 InfluxDB 服务是否正常运行
  uri:
    url: http://localhost:8086/ping
    method: GET
    status_code: 204  # 期望状态码

模板文件

txt
# roles/influxdb/templates/influxdb.conf.j2
# InfluxDB 主配置文件模板

# 元数据存储配置
[meta]
  # 元数据存储目录路径
  dir = "/var/lib/influxdb/meta"
  # 自动创建保留策略
  retention-autocreate = true
  # 启用元数据日志
  logging-enabled = true
  # 选举超时时间
  election-timeout = "1s"
  # 心跳超时时间
  heartbeat-timeout = "1s"
  # 领导者租约超时时间
  leader-lease-timeout = "500ms"
  # 禁用集群追踪
  cluster-tracing = false
  # 元数据节点绑定地址
  bind-address = ":8091"

# 数据存储配置
[data]
  # 数据存储目录
  dir = "/var/lib/influxdb/data"
  # WAL 日志目录
  wal-dir = "/var/lib/influxdb/wal"
  # 启用查询日志
  query-log-enabled = true
  # 缓存最大内存大小(默认 2GB)
  cache-max-memory-size = {{ influxdb_cache_max_memory_size | default('2147483648') }}
  # 缓存快照内存大小(默认 25MB)
  cache-snapshot-memory-size = {{ influxdb_cache_snapshot_memory_size | default('26214400') }}
  # 缓存快照写入间隔
  cache-snapshot-write-cold-duration = "10m"
  # 完整压缩写入间隔
  compact-full-write-cold-duration = "4h"
  # 每个数据库的最大系列数
  max-series-per-database = {{ influxdb_max_series_per_database | default('1000000') }}
  # 每个标签的最大值数
  max-values-per-tag = {{ influxdb_max_values_per_tag | default('100000') }}
  # 索引版本
  index-version = "inmem"

# HTTP API 配置
[http]
  # 启用 HTTP API
  enabled = true
  # 绑定地址和端口
  bind-address = ":8086"
  # 启用认证(默认关闭)
  auth-enabled = {{ influxdb_auth_enabled | default('false') }}
  # 启用日志
  log-enabled = true
  # 禁用写入追踪
  write-tracing = false
  # 启用 pprof
  pprof-enabled = true
  # 禁用 HTTPS
  https-enabled = false
  # HTTPS 证书路径
  https-certificate = "/etc/ssl/influxdb.pem"
  # HTTPS 私钥路径
  https-private-key = ""
  # 最大行限制
  max-row-limit = 10000

变量文件

yaml
# roles/influxdb/vars/main.yml
# InfluxDB 角色变量文件
---
# 缓存最大内存大小(2GB)
influxdb_cache_max_memory_size: "2147483648"
# 缓存快照内存大小(25MB)
influxdb_cache_snapshot_memory_size: "26214400"
# 每个数据库的最大系列数
influxdb_max_series_per_database: "1000000"
# 每个标签的最大值数
influxdb_max_values_per_tag: "100000"
# 是否启用认证
influxdb_auth_enabled: "false"

组变量文件

yaml
# group_vars/all.yml
# 所有主机通用变量文件
---
# InfluxDB 版本
influxdb_version: "1.8.10"
# InfluxDB 集群名称
influxdb_cluster_name: "influxdb-cluster"
# 数据复制因子
influxdb_replication_factor: 3

处理器文件

yaml
# roles/influxdb/handlers/main.yml
# InfluxDB 处理器文件,用于处理服务重启
---
# 重启 InfluxDB 服务的处理器
- name: 重启 InfluxDB 服务
  service:
    name: influxdb
    state: restarted

执行 Ansible 剧本

执行基础部署

bash
# 执行完整安装和配置
ansible-playbook -i inventory.ini playbooks/influxdb-install.yml

# 只执行安装任务
ansible-playbook -i inventory.ini playbooks/influxdb-install.yml --tags install

# 只执行配置任务
ansible-playbook -i inventory.ini playbooks/influxdb-install.yml --tags configure

验证部署结果

bash
# 检查 InfluxDB 服务状态
ansible -i inventory.ini influxdb_cluster -m service -a "name=influxdb state=started" --become

# 验证 InfluxDB API 可用性
ansible -i inventory.ini influxdb_cluster -m uri -a "url=http://localhost:8086/ping method=GET status_code=204" --become

InfluxDB 集群部署剧本

集群目录结构流程图

集群主剧本

yaml
# playbooks/influxdb-cluster-install.yml
# InfluxDB 集群安装主剧本
---
# 部署 InfluxDB 元数据节点
- name: 部署 InfluxDB 元数据节点
  hosts: influxdb_masters  # 元数据节点主机组
  become: yes
  roles:
    - influxdb-cluster  # 使用集群角色
  vars:
    node_type: meta  # 节点类型为元数据节点
  tags:
    - meta  # 元数据节点标签

# 部署 InfluxDB 数据节点
- name: 部署 InfluxDB 数据节点
  hosts: influxdb_slaves  # 数据节点主机组
  become: yes
  roles:
    - influxdb-cluster  # 使用集群角色
  vars:
    node_type: data  # 节点类型为数据节点
  tags:
    - data  # 数据节点标签

# 将数据节点加入集群
- name: 将数据节点加入集群
  hosts: influxdb_slaves  # 数据节点主机组
  become: yes
  roles:
    - influxdb-cluster  # 使用集群角色
  vars:
    node_type: join  # 节点类型为加入集群
  tags:
    - join  # 加入集群标签

集群角色任务

yaml
# roles/influxdb-cluster/tasks/main.yml
# 集群角色主任务文件
---
# 执行元数据节点任务
- include_tasks: meta.yml
  when: node_type == "meta"

# 执行数据节点任务
- include_tasks: data.yml
  when: node_type == "data"

# 执行加入集群任务
- include_tasks: join.yml
  when: node_type == "join"

# 执行验证任务
- include_tasks: verify.yml

InfluxDB 监控和维护剧本

Telegraf 部署剧本

yaml
# roles/telegraf/tasks/main.yml
# Telegraf 监控代理部署任务
---
# 在 Debian/Ubuntu 上安装 Telegraf
- name: 安装 Telegraf
  apt:
    name: telegraf
    state: present
  when: ansible_os_family == "Debian"

# 配置 Telegraf 监控 InfluxDB
- name: 配置 Telegraf 监控 InfluxDB
  template:
    src: telegraf.conf.j2
    dest: /etc/telegraf/telegraf.conf
  notify: restart telegraf  # 配置变更时重启服务

# 启动并启用 Telegraf 服务
- name: 启动 Telegraf 服务
  service:
    name: telegraf
    state: started
    enabled: yes

备份剧本

yaml
# playbooks/influxdb-backup.yml
# InfluxDB 备份剧本
---
# 备份 InfluxDB 数据
- name: 备份 InfluxDB 数据
  hosts: influxdb_masters  # 在元数据节点上执行备份
  become: yes
  tasks:
    # 创建备份目录
    - name: 创建备份目录
      file:
        path: /backups/influxdb
        state: directory
        mode: 0755

    # 备份元数据
    - name: 备份 InfluxDB 元数据
      command: influxd backup -meta /backups/influxdb/meta-{{ ansible_date_time.date }}

    # 备份数据库数据
    - name: 备份 InfluxDB 数据库
      command: influxd backup -database {{ item }} /backups/influxdb/{{ item }}-{{ ansible_date_time.date }}
      loop: "{{ influxdb_databases }}"  # 遍历所有数据库
      when: influxdb_databases is defined  # 仅当定义了数据库列表时执行

最佳实践

剧本设计最佳实践

  • 模块化设计:将不同功能拆分为独立的角色和任务,提高可维护性和复用性
  • 变量管理:使用 group_vars 和 host_vars 管理不同环境的变量,便于配置管理
  • 模板化配置:使用 Jinja2 模板生成配置文件,支持动态配置
  • 标签管理:为任务添加标签,支持按需执行特定任务
  • 错误处理:添加适当的错误处理和验证步骤,确保部署成功
  • 文档化:为剧本和角色添加详细的文档和注释

安全最佳实践

  • 使用 SSH 密钥认证:避免在剧本中使用明文密码
  • 限制权限:最小化 Ansible 执行用户的权限
  • 加密敏感数据:使用 Ansible Vault 加密敏感变量和文件
  • 定期更新:定期更新 InfluxDB 版本和依赖包
  • 启用认证和授权:在生产环境中启用 InfluxDB 认证和授权

性能最佳实践

  • 并行执行:利用 Ansible 的并行执行能力,加速大规模部署
  • 使用本地缓存:启用 Ansible 本地缓存,减少重复操作
  • 优化剧本结构:减少不必要的任务和模块调用
  • 使用异步任务:对于长时间运行的任务,使用异步执行

常见问题及解决方案

部署失败

问题:Ansible 部署过程中出现错误,导致部署失败。

解决方案

  1. 查看详细的错误日志,确定失败原因
  2. 检查目标节点的网络连接和权限
  3. 验证变量和模板配置是否正确
  4. 使用 --verbose 参数获取更详细的执行信息
  5. 尝试单独执行失败的任务,定位问题

服务启动失败

问题:InfluxDB 服务启动失败,查看日志显示配置错误。

解决方案

  1. 检查配置文件语法是否正确:influxd config check -config /etc/influxdb/influxdb.conf
  2. 验证配置文件权限是否正确
  3. 检查数据目录权限和磁盘空间
  4. 查看系统日志获取更多信息:journalctl -u influxdb

集群节点无法加入

问题:数据节点无法加入 InfluxDB 集群。

解决方案

  1. 检查元数据节点是否正常运行
  2. 验证集群连接参数是否正确
  3. 检查防火墙规则,确保节点间通信正常
  4. 查看元数据节点日志获取更多信息

备份失败

问题:InfluxDB 备份任务执行失败。

解决方案

  1. 检查备份目录权限和磁盘空间
  2. 验证 InfluxDB 服务是否正常运行
  3. 检查数据库名称是否正确
  4. 查看 InfluxDB 日志获取更多信息

常见问题(FAQ)

Q1: 如何使用 Ansible 部署不同版本的 InfluxDB?

A1: 可以通过修改 group_vars 中的 influxdb_version 变量,或者在剧本中指定版本参数来部署不同版本的 InfluxDB。

Q2: 如何使用 Ansible 配置 InfluxDB 认证?

A2: 可以通过修改 group_vars 中的 influxdb_auth_enabled 变量为 true,然后运行配置剧本即可启用 InfluxDB 认证。

Q3: 如何使用 Ansible 部署 InfluxDB Enterprise 版本?

A3: 需要修改角色中的安装任务,添加 Enterprise 版本的仓库和许可证配置,然后按照类似的流程部署。

Q4: 如何使用 Ansible 升级 InfluxDB?

A4: 可以编写专门的升级剧本,先备份数据,然后更新软件包,最后验证服务状态。

Q5: 如何使用 Ansible 监控 InfluxDB 集群?

A5: 可以结合 Telegraf 和 Grafana 角色,使用 Ansible 自动化部署监控系统。

Q6: 如何使用 Ansible 管理 InfluxDB 数据库和用户?

A6: 可以使用 influxdb 模块或者命令行模块,编写专门的剧本管理数据库、用户和权限。

Q7: 如何使用 Ansible 实现 InfluxDB 高可用部署?

A7: 可以编写高可用部署剧本,配置多个元数据节点和数据节点,实现 InfluxDB 集群的高可用。

Q8: 如何使用 Ansible Vault 加密敏感数据?

A8: 可以使用 ansible-vault create 命令创建加密文件,然后使用 ansible-playbook --ask-vault-pass 命令执行剧本。

Q9: 如何优化 Ansible 部署 InfluxDB 的性能?

A9: 可以通过并行执行、使用本地缓存、优化剧本结构、使用异步任务等方式优化 Ansible 部署性能。

Q10: 如何测试 Ansible 剧本的正确性?

A10: 可以使用 ansible-playbook --check 命令进行语法检查和模拟执行,然后在测试环境中实际执行剧本,验证部署结果。