使用Ansible、主机变量安装Nagios



我正在学习Ansible,我想安装Nagios服务器与几个监控节点。我所遵循的Nagios安装步骤来自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

如何为每个被监视的节点创建配置文件模板,以便使用适当的值创建配置文件?

:编辑:

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

你的游戏只针对你的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配置文件,其名称与slaves组下目录文件中的条目相同(可以是任何内容,但默认情况下是IP地址、短域名或完全限定域名),并在.

中模板化期望值。

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

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

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

最新更新