在将主机名分配给服务器之前,有没有人有更好的解决方案来配置具有主机名的实例?
假设我们正在使用 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
在剧本中,我可以测试是否存在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
结果:
TASK: [Debug hostname] ********************************************************
fatal: [ec2-1-2-3-4.compute-1.amazonaws.com] => One or more undefined variables: 'new_hostname' is undefined
为每台服务器设置new_hostname是可行的,但我不想为每台服务器都设置它,只是那些需要新主机名的服务器。它还破坏了主机名分组,例如:
ec2-1-2-3-[4:5].compute-1.amazonaws.com
如果new_hostname存在,则有效:
- name: "set hostname fact"
set_fact: testvar1={{ new_hostname }} || {{ inventory_hostname }}
- name: "show hostname fact"
debug: msg="testvar1={{ testvar1 }}"
结果:
TASK: [set hostname fact] *****************************************************
ok: [ec2-1-2-3-4.compute-1.amazonaws.com]
TASK: [show hostname fact] ****************************************************
ok: [ec2-1-2-3-4.compute-1.amazonaws.com] => {"msg": "testvar1=new-instance.example.com"}
但是,如果error_on_undefined_vars设置为默认值true,并且未设置new_hostname,则会失败。
此策略的最佳实践?