情况是这样的:我们正在使用sible对GCP中新部署的vm进行一系列更改。其中一个更改是更新主机名。
GCP要求主机名的第一个字符必须是字母。所以,假设我们在GCP中的主机名是pc1000等等。使用Ansible,我想动态地拉出主机名(PC1000-blah-blah)并将其更改为1000-blah-blah,删除"PC"
现在,我可以在一个VM一个VM的基础上使用ansible.windows。Win_hostname插件:https://docs.ansible.com/ansible/latest/collections/ansible/windows/win_hostname_module.html
但是我还没能弄清楚如何在一组虚拟机上运行我的剧本,在那里它足够聪明,可以看到当前的主机名(与PC)并在每个上删除PC。
任何帮助都是感激的!
您可以使用ansible-module-gce-facts
收集有关实例的信息。在Ansible剧本中,可以使用hosts: 127.0.0.1
和connection:local
来运行eg。gcloud
在本地外壳。
设置hostname
也可以通过元数据完成。对于Windows VM,还有更多的可能性来自动化实例(如果设置元数据hostname
不够的话):
windows-startup-script-url
,windows-startup-script-cmd
,windows-startup-script-bat
,windows-startup-script-ps1
,sysprep-specialize-script-url
,sysprep-specialize-script-cmd
,sysprep-specialize-script-bat
,sysprep-specialize-script-ps1
.
这里有一个例子sysprep-specialize-script-ps1
:instance_setup.ps1
…特别是function Change-InstanceName
不仅应该在sys-prep脚本中,而且应该作为windows-startup-script-ps1
运行,这样安装将始终从元数据中反映当前主机名:
function Change-InstanceName {
<#
.SYNOPSIS
Changes the machine name for GCE Instance
.DESCRIPTION
If metadata server is reachable get the instance name for the machine and
rename.
#>
Write-Log 'Getting hostname from metadata server.'
if ((Get-CimInstance Win32_BIOS).Manufacturer -cne 'Google') {
if (-not (Test-Connection -Count 1 metadata.google.internal -ErrorAction SilentlyContinue)) {
Write-Log 'Not running in a Google Compute Engine VM.' -error
return
}
}
$count = 1
do {
$hostname_parts = (Get-Metadata -property 'hostname') -split '.'
if ($hostname_parts.Length -le 1) {
Write-Log "Waiting for metadata server, attempt $count."
Start-Sleep -Seconds 1
}
if ($count++ -ge 60) {
Write-Log 'There is likely a problem with the network.' -error
return
}
}
while ($hostname_parts.Length -le 1)
$new_hostname = $hostname_parts[0]
# Change computer name to match GCE hostname.
# This will take effect after reboot.
try {
(Get-WmiObject Win32_ComputerSystem).Rename($new_hostname)
Write-Log "Renamed from $global:hostname to $new_hostname."
$global:hostname = $new_hostname
}
catch {
Write-Log 'Unable to change hostname.'
Write-LogError
}
}
所以你可能不会用ansible改变主机名…但是仍然可以编辑元数据,以便更改hostname
并提供windows sys-prep或启动脚本,然后让这些实例自己应用元数据。Powershell(然后重新启动以应用新的主机名)。
可以在每个实例上运行(Get-WmiObject Win32_ComputerSystem).Rename($new_hostname)
,并/或在这样做时删除前面的PC
,然后重新启动-但仍然建议让脚本拾取并应用元数据(这是自我管理的)。好吧,只有在主机名实际更改时才重新启动可能是有意义的(上面的示例是一个系统准备脚本,因此它假设在运行后重新启动/关闭)。
这至少会给你当前的主机名,根据元数据(while set):
gcloud compute instances describe instance-1 --zone europe-west3-c --format="value(metadata.items.hostname)"