Ansible을 사용하여 다른 호스트의 호스트 변수에 액세스하는 방법은 무엇입니까?


45

데이터를 수집하는 호스트가 있고 그룹에 있다고 가정 해 봅시다 [collectors]. 또한 그룹에 호스트가 [reporters]있습니다. 그래서 groups['collectors'][0]ip 주소 에서 기자에게 변수를 설정하고 싶습니다 . 그러나 리포터 설정을위한 플레이 북은 [collectors]그룹에서 실행되지 않으므로이 호스트에 대한 사실은 수집되지 않습니다. IP 주소를 하드 코딩하지 않는 방법이 있습니까?

답변:


87

다음과 같은 작업을 수행하면 거의 모든 인벤토리 사실 / 변수에 액세스 할 수 있습니다.

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

또는 색인을 통해 그룹으로 만들려면 다음을 수행하십시오.

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

가장 중요한 요령은 관심있는 모든 호스트 / 그룹에 대한 사실을 수집해야한다는 것입니다. 따라서 리포터 그룹에 대해 실행되는 플레이 북을 수정하여 적용되지 않는 (더미) 작업을 포함 시키려고합니다. 수집가 그룹에. 그러면 Ansible이 콜렉터 호스트에 대한 사실을 수집하여 리포터 그룹에서 액세스 할 수 있습니다. 리포터 플레이 북 상단에 다음과 같은 내용을 추가 할 수 있습니다.

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

빈 괄호는 기본적으로 아무 작업도 실행되지 않음을 의미하지만 Ansible은 수집기에 대한 사실을 수집하여 리포터에 대해 실행하는 작업에서 참조를 수집 할 수 있습니다.

편집 # 1

또한 Ansible의 1.8 버전부터 현재 사용 가능한 사실 캐싱 기능이 있다고 언급해야 합니다. 팩트 캐싱은 redis 서버를 사용하여 플레이 북 실행간에 팩트를 저장합니다. 이 기능을 사용하면 한 플레이 북이 이전에 실행 된 다른 플레이 북에서 얻은 사실을 참조 할 수 있습니다. Ansible 설명서의 예는 다음과 같습니다.

예를 들어 수천 개의 호스트가있는 매우 큰 인프라를 상상해보십시오. 팩트 캐싱은 야간에 실행되도록 구성 할 수 있지만 소규모 서버 세트 구성은 하루 종일 임시 또는 주기적으로 실행될 수 있습니다. 사실 캐싱을 사용하면 모든 서버를 "히트"하여 변수 및 해당 정보를 참조 할 필요는 없습니다.


2
연관 인덱스를 변수로 설정하는 방법이 있습니까? 예 : 사용 가능한 localhost --extra-vars "metamorphosis_ip = 172.16.3.73"-a "echo {{hostvars [{{metamorphosis_ip}}] [ 'inv_domain']}}"
corretge

위의 답변에 추가하려면 Ancsible FAQ를 참조하십시오 : docs.ansible.com/ansible/faq.html 호스트 그룹을 반복하거나 특정 호스트를 얻기 위해 변수를 설정하는 것과 같이 세부 사항을 설명합니다 그룹에서.
einarc 2016 년

빈 작업 목록이있는 노드에서 팩트를 가져 오는 아이디어에 감사드립니다.
pedz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.