Bash 또는 Python에서 for 루프를 사용하여 파일 차이점 찾기

Bash 또는 Python에서 for 루프를 사용하여 파일 차이점 찾기

Ansible 호스트 파일에 Linux 시스템을 추가하기 위해 자동화 스크립트를 사용하려고 합니다. 자동화된 프로세스는 다음과 같습니다.

  1. LinuxVms.txtAnsible 머신은 Vmware 서버 중 하나에서 명명된 Linux 가상 머신 목록을 가져옵니다.

  2. 아래와 같이 쉘 스크립트를 개발했습니다. 파일 [all_linux_host]의 서버를 LinuxVms.txt태그에 추가합니다. 이 스크립트는 단일 작업에 사용될 때 작동합니다.

이 과정이 끝난 후 내가 하고 싶은 일은 다음과 같습니다.

  • VM 팀은 자동으로 LinuxVm.txt목록을 ansible 서버에 보내고 파일에 새 IP 주소가 있으면 이 IP 주소를 태그 아래의 LinuxVm.txtansible 호스트 파일에 추가해야 합니다 .[all_linux_host]

for나는 루프가 이것을 위해 작동해야 한다고 생각합니다 . 루프는 ansible 호스트 파일의 모든 태그가 아닌 for새로 도착한 LinuxVm.txt파일과 태그를 제어해야 합니다. [all_linux_host]파일과 태그 사이에 차이가 있는 경우에는 그 차이를 찾아 태그에 추가해야 합니다 [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

관련 정보