使用Ansible安装Nagios,宿主变量

时间:2015-10-12 18:21:28

标签: ansible nagios ansible-playbook

我正在学习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

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

:编辑:

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

2 个答案:

答案 0 :(得分:3)

您的游戏专门定位到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%
        }

这将在主服务器上生成名为与slaves组下的库存文件中的条目相同的Nagios配置文件(这可能是任何内容,但默认情况下是IP地址,短或完全限定域名称)为slaves组中的每个服务器,其中包含模板化的预期值。

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

答案 1 :(得分:1)

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

我可以创建一个变量来跟踪并指定主机是主服务器还是从服务器,例如使用master或{{1}之类的东西,而不是将主机名定义为cluster_type: master。 }}。这些变量可以作为主变量或组变量应用(如果您有多个从站,这可能是您想要的)。理想情况下,清单中的主机名应该是您可以实际连接和引用的名称。