有沒有人有更好的解決方案來配置主機名實例,然後才能將該主機名分配給服務器?Ansible:如何在DNS分配之前設置主機名
假設我們正在使用AWS並實例化實例ec2-1-2-3-4.compute-1.amazonaws.com。在配置完成後,我們最終會在DNS的new-instance.example.com中爲其分配一個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未設置,則失敗。
此策略的最佳實踐?
不要認爲這種方法適用於'when',因爲它需要一個布爾值而不是字符串。 – Rico
@Rico oups對不起,忘了定義。應付粘貼重命名錯誤。看到更正的答案 –
@Jimmy_Kane沒問題。這也將工作:-) – Rico