我正在尝试使用自动化脚本将 Linux 机器添加到 ansible 主机文件中。自动化流程为:
LinuxVms.txt
Ansible 机器获取从 Vmware 服务器之一命名的 Linux 虚拟机列表。我开发了一个 shell 脚本,如下所示。它将服务器
[all_linux_host]
从LinuxVms.txt
文件添加到标签中。该脚本在单个操作中使用时有效。
经过这个过程,我想做的是:
- VM 团队会自动将
LinuxVm.txt
列表发送到 ansible 服务器,如果该LinuxVm.txt
文件有新的 IP 地址,我需要将此 IP 地址添加到 ansible 主机文件的[all_linux_host]
标签下。
我认为for
循环应该适用于此。循环for
必须控制新到达的LinuxVm.txt
文件和[all_linux_host]
标签,而不是 ansible 主机文件中的所有标签。如果文件和标签之间存在差异,则必须找到该差异并将其添加到标签中[all_linux_host]
。
例如
LinuxVms.txt
1.1.1.1 2.2.2.2 3.3.3.3 12.12.12.12
- 当前的、ansible 主机文件
/etc/ansible/hosts
请注意,这[test] 8.8.8.8 12.12.12.12 13.13.13.13 [all_linux_hosts] 1.1.1.1 2.2.2.2
[all_linux_hosts]
是 ansible 主机文件中的最后一部分。 - for循环之后,ansible主机文件必须是这样的
IP 地址的顺序并不重要。[test] 8.8.8.8 12.12.12.12 13.13.13.13 [all_linux_hosts] 1.1.1.1 2.2.2.2 3.3.3.3 12.12.12.12
你能帮我开发循环for
吗?
一次性操作不需要考虑这一部分。
#!/bin/bash
sudo cp /home/vmteam/LinuxVMs.txt /home/xxx
sudo chown xxx: /home/vmteam/LinuxVMs.txt
sudo dos2unix /home/xxx/LinuxVMs.txt
awk '{print $1}' /home/xxx/LinuxVMs.txt >> ansible_host_file ##file correction
awk '{print $2}' /home/xxx/LinuxVMs.txt >> ansible_host_file ##file correction
sed -i 's/PublicIp//g' /home/xxx/ansible_host_file
sed -i 's/-//g' /home/xxx/ansible_host_file
sed -i '/^\s*$/d' /home/xxx/ansible_host_file
sed -i 's/IpAddress1/ /g' /home/xxx/ansible_host_file
sed -i '/^\s*$/d' /home/xxx/ansible_host_file```
答案1
a[".."]
填充vms 文件中提到的 Linux 主机上键入的关联数组。然后勾选 ansible 文件中看到的主机并打印最后剩下的内容。
awk '
NR==FNR {a[$1];next}
$1=="[all_linux_hosts]",0 {
if ( $1 in a ) delete a[$1]
};1
END {
for (host in a) print host
}
' LinuxVms.txt /etc/ansible/hosts
[test]
8.8.8.8
12.12.12.12
13.13.13.13
[all_linux_hosts]
1.1.1.1
2.2.2.2
12.12.12.12
3.3.3.3