
저는 현재 Debian 11 템플릿에서 가져온 새로운 가상 머신을 사용자 정의하기 위해 Ansible에서 사용하는 네트워크 구성 역할을 개발 중입니다.
다음 역할은 DHCP에서 정적 인터페이스 구성으로 변경된 다음 네트워킹 서비스를 다시 시작합니다. 테스트 목적으로 IP/넷마스크/게이트웨이를 추가 변수로 설정했습니다. (동적으로 변경되는 것은 내 역할을 사용해야 하는 서버에 따라 다릅니다.)
- name: ens3 reconfiguration
ansible.builtin.template:
src: interfaces.j2
dest: /etc/network/interfaces
- name: Restart networking.service
ansible.builtin.service:
name: networking
state: restarted
이해를 돕기 위해 인터페이스.j2의 내용은 다음과 같습니다.
# The primary network interface
auto ens3
iface ens3 inet static
address {{ ens3_ip }}/{{ ens3_netmask }}
gateway {{ ens3_gateway }}
dns-nameservers X.X.X.X
dns-search my_domain.net
여기서 문제는 네트워크 인터페이스가 dhcp로 구성되어 있으므로 예를 들어 10.0.0.1이 있고 10.0.0.50으로 재구성한 다음 Ansible이 다시 시작 네트워킹.서비스 작업으로 이동하고 영원히 정지된다는 것입니다.
**Ansible 관점에서 새 IP를 사용하여 호스트에 동적으로 다시 연결할 수 있습니까? 아니면 네트워킹.서비스 재시작의 실행 결과를 우회할 수도 있나요? **
답변1
다음에 나열된 질문에 매우 가깝지만https://serverfault.com/users/378597/peter-zhabin용도win_shell, Linux에는 적용되지 않습니다.
내 머리 꼭대기에서 이것이 Linux의 솔루션이 될 것 같습니다. win_shell을 쉘로 변경했지만 제안을 약간 수정하여 Linux의 bash 쉘에 더 가깝게 정렬했습니다.
- 네트워크 다시 시작 작업에는
async
및를 사용합니다 .poll
- 그런 다음
set_fact
노드 IP를 업데이트합니다. - 그런 다음 SSH 포트가 새 IP에서 응답할 때까지 기다립니다.
- 마지막으로 남은 작업을 계속 진행하세요.
- name: Async restart of networking.service
shell: "sleep 1; systemctl restart networking.service &"
args:
executable: /bin/bash
async: 100
poll: 0
- name: set_fact for the nodes new IP
set_fact:
ansible_host: "10.0.0.50"
- name: wait_for ssh port access
local_action:
module: wait_for
host: "{{ ansible_host }}"
port: 22
delay: 60
state: started
register: network_responding
그런 다음 등록한 후 플레이북에 다른 작업을 추가하면 wait_result
해당 작업은 다음과 같은 조건부 when 절을 가질 수 있습니다.
when: network_responding|bool == true
bash를 사용하여 다시 시작을 쉘로 변환하고 다시 시작 작업을 배경으로 했습니다. 이것은 필요하지 않을 수도 있지만 YMMV는 다음과 같은 논리를 사용하려고 합니다.ansible.buildin.serviceshell
, 테스트 없이 이 작업을 수행하는 것도 실행 가능한지 비교하기가 매우 간단해야 합니다 .