我正在学习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: master
或cluster_type: slave
之类的变量。这些变量可以应用为主机变量或组变量(如果您有多个从服务器,这可能是您想要的)。理想情况下,目录中的主机名应该是可以实际连接和引用的。