使用 for 循环与 bash 或 python 查找文件差异

使用 for 循环与 bash 或 python 查找文件差异

我正在尝试使用自动化脚本将 Linux 机器添加到 ansible 主机文件中。自动化流程为:

  1. LinuxVms.txtAnsible 机器获取从 Vmware 服务器之一命名的 Linux 虚拟机列表。

  2. 我开发了一个 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主机文件必须是这样的
    [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
    
    IP 地址的顺序并不重要。

你能帮我开发循环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

相关内容