使用 Ansible 安装 Nagios,主机变量

install Nagios with Ansible, host variables

我正在学习 Ansible,我想安装带有多个受监控节点的 Nagios 服务器。我遵循的 Nagios 安装步骤是 from this tutorial on Digitalocean.

本教程的第 5 步让我感到困惑,因为这是我第一次使用 Ansible。这一步涉及到主服务器上监控节点的配置文件,我使用这样的模板实现的

- name: Configure Nagios server
  hosts: master
  sudo: true
  vars:
      nagios_slaves_config_dir: /etc/nagios/servers
      nagios_config_file: /etc/nagios/nagios.cfg
  tasks:
      # shortened for brevity
    - name: copy slaves config
      template: src=../templates/guest.cfg.j2 dest=/etc/nagios/servers/{{ item }}.cfg owner=root mode=0644
      with_items: groups['slaves']

模板看起来像这样

define host {
        use                     linux-server
        host_name               {{ inventory_hostname }}
        alias                   {{ inventory_hostname }}
        address                 {{ hostvars['slave'].ansible_eth1.ipv4.address }}
        }

define service {
        use                             generic-service
        host_name                       {{ inventory_hostname }}
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
        }

此配置文件已创建,但 {{ inventory_hostname }} 变量错误 - 而不是 node_1 它声明 master

我如何为每个受监控的节点模板化配置文件,以便使用正确的值创建它?

:编辑:

一个想法是在监控节点上生成配置文件并将它们复制到主节点。明天试试。

从您的解释中不清楚您希望 Ansible 从何处获取 node_1 值。如果这不是主机名,信息存储在哪里?如果它存储在变量中,您可以那样访问它,但从它的外观来看,您正在以一种向后的方式使用您的库存。您不应该使用系统的内部实现细节作为清单名称。您甚至如何能够通过 /etc/hosts 中的条目连接到 master

我可以创建一个变量来跟踪和指定主机是主机还是从机,而不是将主机名定义为 master,例如,使用 cluster_type: mastercluster_type: slave。这些变量可以用作主机变量或组变量(如果您有多个从属变量,这可能是您想要的)。清单中的主机名最好是您可以实际连接和引用的名称。

您的游戏专门针对您的 master 服务器:

- name: Configure Nagios server
  hosts: master
  ...

因此该任务将仅针对此节点(或名为 master 的清单组中的多个节点)运行。

然后您似乎对如何从您希望监视的其他服务器获取变量(在您的案例中 slaves 清单组中的所有内容)感到困惑。

inventory_hostname 将完成它在罐子上所说的几乎所有内容 - 它将为您提供任务 运行 所针对的服务器的主机名。在这种情况下,这只会是 master.

然而,你在这条线的正确轨道上:

        address                 {{ hostvars['slave'].ansible_eth1.ipv4.address }}

但您应该改为使用在任务循环中传递给模板的 item(您使用 with_items: groups['slaves'] 循环遍历 slaves 中的所有主机)。

所以您的模板看起来像:

define host {
        use                     linux-server
        host_name               {{ hostvars[item].ansible_hostname }}
        alias                   {{ hostvars[item].ansible_hostname }}
        address                 {{ hostvars[item].ansible_eth0.ipv4.address }}
        }

define service {
        use                             generic-service
        host_name                       {{ hostvars[item].ansible_hostname }}
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
        }

这将在主服务器上生成一个 Nagios 配置文件,其名称与 slaves 组下的清单文件中的条目相同(这可以是任何东西,但默认情况下是 IP 地址,短的或完整的slaves 组中每台服务器的合格域名),其中包含模板化的预期值。

或者您可能需要重新考虑您的整个策略,以便 运行针对受监视节点执行任务会在 Nagios 服务器上创建配置文件,从而允许您注册要使用中央 Nagios 服务器监视的服务器。