我有一个设置手册,它采用新安装的Linux实例,以默认用户身份登录(我们将调用user1),创建另一个用户(我们将调用user2),然后禁用user1.因为user1只能在执行这组任务之前访问实例,所以任务都在一个特殊的playbook中,我们必须记住在新实例上运行.之后,所有常见任务都由user2运行,因为user1不再存在.
我想结合设置和普通的剧本,这样我们就不用再手动运行设置剧本了.我尝试创建一个任务,以查看实例上存在哪个用户,通过尝试通过SSH作为user1登录来使原始设置任务成为条件.问题是,如果我为任一用户尝试SSH登录,则ansible退出时会出现FATAL错误,因为它无法登录:user2在新实例上尚不存在,或者user1在执行安装程序后已被禁用.
我相信通过SSH测试登录是确定实例所处的条件的唯一方法.有没有办法测试SSH登录而不会出现致命错误然后根据结果有条件地执行任务?
我在EC2中运行神经节,报告效果很好.我正在运行gmetad来监控来自管理报告实例的数据库集群,该实例是我们所有系统的集中式仪表板.我不希望将此实例包含在监视中.在admin gmond.conf中,我设置了:
mute = yes
Run Code Online (Sandbox Code Playgroud)
但这只会让网络前端显示主机已经死亡.在admin gmetad.conf中,我将data_source设置为:
data_source "cluster" ec2-X-X-X-X.compute-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud)
(ec2-XXXX.compute-1.amazonaws.com是管理实例的ec2主机名)
我认为设置mute=yes会将它从报告和gstat中删除,但两者仍然显示管理主机(localhost)已死.
有没有办法做到这一点?
在将主机名分配给服务器之前,有没有人有更好的解决方案来配置具有主机名的实例?
假设我们正在使用AWS并实例化实例ec2-1-2-3-4.compute-1.amazonaws.com.配置完成后,我们最终会在new-instance.example.com的 DNS中为其分配一个CNAME,以替换已在生产中的现有实例.
new-instance.example.com已经存在且正在生产中,因此我们无法将CNAME重新分配给ec2-1-2-3-4.compute-1.amazonaws.com,直到机器配置正确并且我们是准备切换.我们现在希望内部配置文件和实例上的主机名为new-instance.example.com,以便为DNS更改做准备.所以我们不能使用inventory_hostname变量,因为它将是ec2-1-2-3-4.compute-1.amazonaws.com.我也有正常的生产服务器,不需要使用新的主机名,所以我希望能够使用现有的inventory_hostname.
到目前为止,我最好的想法是在库存文件中分配一个变量:
[production]
ec2-1-2-3-4.compute-1.amazonaws.com new_hostname=new-instance.example.com
Run Code Online (Sandbox Code Playgroud)
在剧本中,我可以测试new_hostname的存在.如果存在new_hostname,则使用它,如果不存在,则使用inventory_hostname.除非将error_on_undefined_vars设置为false,否则这将导致致命错误,并且我不希望将其设置为防止打字错误的好处.以下失败的一个例子.
测试手册:
- hosts: all
tasks:
- name: "Debug hostname"
debug: msg="inventory_hostname={{ inventory_hostname }}, hostvars[inventory_hostname]['inventory_hostname']={{ hostvars[inventory_hostname]['inventory_hostname'] }}, ansible_hostname={{ ansible_hostname }}, new_hostname={{ new_hostname }}"
ignore_errors: yes
Run Code Online (Sandbox Code Playgroud)
结果:
TASK: [Debug hostname] ********************************************************
fatal: [ec2-1-2-3-4.compute-1.amazonaws.com] => One or more undefined variables: 'new_hostname' is undefined
Run Code Online (Sandbox Code Playgroud)
为每个服务器设置new_hostname都可行,但我不想为每个服务器设置它,只需要为需要新主机名的服务器设置它.它还会破坏主机名分组,例如:
ec2-1-2-3- [4:5] .compute-1.amazonaws.com
如果存在 …