Ansible:如何在DNS分配之前设置主机名

Dav*_*ern 4 ansible ansible-playbook

在将主机名分配给服务器之前,有没有人有更好的解决方案来配置具有主机名的实例?

假设我们正在使用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

如果存在new_hostname,则可以:

- name: "set hostname fact"
  set_fact: testvar1={{ new_hostname }} || {{ inventory_hostname }}

- name: "show hostname fact"
  debug: msg="testvar1={{ testvar1 }}"
Run Code Online (Sandbox Code Playgroud)

结果:

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"}
Run Code Online (Sandbox Code Playgroud)

但是,如果将error_on_undefined_vars设置为默认值true,并且未设置new_hostname,则会失败.

这个策略的最佳实践?

Jim*_*ane 6

非常害羞,因为我也是新手,如果我理解你的问题,一种方法是使用when: something is defined任务.

例:

  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 }}"
      when: new_hostname is defined
Run Code Online (Sandbox Code Playgroud)

现在这是一种方法.另一种方法是为此发挥作用,并且只能从库存中添加的条目中将该角色(旋转过程)分别发挥到目标机器.如果您喜欢一些额外的阅读,请查看最佳实践.