我正在学习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
如何为每个受监控节点模拟配置文件,以便使用正确的值创建它?
:编辑:
一个想法是在受监视节点上生成配置文件并将它们复制到主节点。明天会尝试。
答案 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
。 }}。这些变量可以作为主变量或组变量应用(如果您有多个从站,这可能是您想要的)。理想情况下,清单中的主机名应该是您可以实际连接和引用的名称。