使用Ansible主机变量安装Nagios

使用Ansible主机变量安装Nagios,ansible,nagios,ansible-playbook,Ansible,Nagios,Ansible Playbook,我正在学习Ansible,我想安装带有几个受监控节点的Nagios服务器。Nagios安装步骤如下 本教程的第5步让我感到困惑,因为这是我第一次使用Ansible。这一步涉及到主服务器上受监控节点的配置文件,这是我使用如下模板实现的 - name: Configure Nagios server hosts: master sudo: true vars: nagios_slaves_config_dir: /etc/nagios/servers nagios

我正在学习Ansible,我想安装带有几个受监控节点的Nagios服务器。Nagios安装步骤如下

本教程的第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%
        }
模板看起来像这样

- 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\u hostname}
变量错误-它不是
节点1
而是声明
主节点

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

:编辑:


一个想法是在受监视的节点上生成配置文件并将其复制到主节点。明天将尝试。

从您的解释中不清楚您希望Ansible从何处获得
节点1
值。如果这不是主机名,信息还存储在哪里?如果它存储在variable中,您可以通过这种方式访问它,但从外观上看,您正在以一种向后的方式使用您的库存。您不应将系统的内部实现详细信息用作库存名称。您是如何通过
/etc/hosts
中的条目连接到
主机的


我不需要将主机名定义为
master
,而是可以创建一个变量来跟踪并指定主机是master还是slave,例如,使用
cluster\u type:master
cluster\u type:slave
之类的方法。这些变量可以作为主机变量或组变量应用(如果您有多个从机,这可能是您想要的)。理想情况下,目录中的主机名应该是您可以实际连接和引用的主机名。

您的游戏只针对您的
主服务器:

- name: Configure Nagios server
  hosts: master
  ...
因此,该任务将仅针对该节点(或名为
master
的资源清册组中的多个节点)运行

然后,您似乎对如何从希望监视的其他服务器获取变量(在您的情况下,
slaves
inventory组中的所有内容)有点困惑

inventory\u hostname
将执行tin上所述的大部分操作—它将为您提供运行任务的服务器的主机名。在这种情况下,它只会是
主控

但是,您在这条线路上走的是正确的:

        address                 {{ hostvars['slave'].ansible_eth1.ipv4.address }}
但是您应该使用传递给任务循环中模板的
(您使用
和\u 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配置文件,该文件的名称与
从属服务器
组下的清单文件中的条目相同(默认情况下,它可以是IP地址、短域名或完全限定域名),用于
从属服务器
组中的每台服务器,预期值以中的模板表示


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

主服务器
显然将成为资源清册文件中的一个条目,而
从服务器
也将同样如此是应该由这个Nagios服务器监视的一组服务器我不知道
{{{item}}
将被传递到模板。回答得很好,谢谢。