Ansible 호스트 파일에 Linux 시스템을 추가하기 위해 자동화 스크립트를 사용하려고 합니다. 자동화된 프로세스는 다음과 같습니다.
LinuxVms.txt
Ansible 머신은 Vmware 서버 중 하나에서 명명된 Linux 가상 머신 목록을 가져옵니다.아래와 같이 쉘 스크립트를 개발했습니다. 파일
[all_linux_host]
의 서버를LinuxVms.txt
태그에 추가합니다. 이 스크립트는 단일 작업에 사용될 때 작동합니다.
이 과정이 끝난 후 내가 하고 싶은 일은 다음과 같습니다.
- VM 팀은 자동으로
LinuxVm.txt
목록을 ansible 서버에 보내고 파일에 새 IP 주소가 있으면 이 IP 주소를 태그 아래의LinuxVm.txt
ansible 호스트 파일에 추가해야 합니다 .[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 호스트 파일은 다음과 같아야 합니다.
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