我有一个 ELK 堆栈,用于满足我们的日志记录需求。该堆栈包括 1 个 Logstash 服务器、3 个 Elasticsearch 和 1 个 Kibana 服务器。所有服务器都在 Ansible 中提供了剧本,可在需要时重新部署。
当我重新部署 Elasticsearch 时,我遇到了一个小问题,需要运行sudo service elasticsearch restart
才能使其再次运行,我希望我的剧本能够从头到尾运行它。当我运行剧本时,它会创建一个临时实例,配置该实例,保存 AMI,创建启动配置并将其附加到扩展组。然后它从 1 个实例扩展到 3 个实例,但我认为问题是第一个实例不知道其他两个实例。
有没有办法让 Elasticsearch 在每个 Ubuntu 实例启动时自动重启?这应该可以解决问题。
答案1
听起来这里有两个问题(自动启动 Elasticsearch 和发现其他实例)。我会尝试回答这两个问题。
自动启动
假设您的构建基于具有 systemd 的最新 Linux 发行版,您可以安装系统单元文件来自动启动 Elasticsearch。根据以下文档https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html#systemd看起来官方的 RPM 和 APT 软件包都包含这个。假设您是从软件包安装的,那么系统单元实际上可能已经存在了。
它可能已被禁用,您可以检查:
andy@search-logs2:~$ sudo systemctl is-enabled elasticsearch
disabled
如果是这种情况,在构建 AMI 期间您只需运行:
andy@search-logs2:~$ sudo systemctl enable elasticsearch
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
如果你以其他方式安装了 Elasticsearch 并且没有单元文件,官方的 Ansible Elasticsearch 角色会安装一个。你可以直接复制他们的作为示例:https://github.com/elastic/ansible-elasticsearch/blob/master/templates/systemd/elasticsearch.j2。然后您可以使用 Ansible 或systemctl
使该设备在启动时启动。
发现其他实例
有一些插件可用于发现 AWS 等云提供商中的实例。请查看 EC2 发现插件https://www.elastic.co/guide/en/elasticsearch/plugins/6.3/discovery-ec2.html默认情况下,它将尝试发现帐户中的任何其他实例。通过设置groups
或host_type
设置进行限制:https://www.elastic.co/guide/en/elasticsearch/plugins/6.3/_settings.html。
我有一个类似的设置,但在 Google Cloud 中,当添加实例时,新节点会使用系统单元文件自动启动,并在一分钟后使用 GCP 发现插件加入集群。
答案2
创建两个实例作为 ansible 脚本的一部分,让它们相互发现,然后创建 ami。这样,实例将认为自己是集群的一部分,然后当您从 ami 加载它时,它将寻找其他实例。
答案3
也许您可以尝试通过一项任务重新启动 elasticsearch 服务。它看起来像这样:
- name: Restart service elasticsearch
service:
name: "{{inventory_hostname}}_elasticsearch"
state: restarted
韋斯