데이터를 수집하는 호스트가 있고 그룹에 있다고 가정 해 봅시다 [collectors]
. 또한 그룹에 호스트가 [reporters]
있습니다. 그래서 groups['collectors'][0]
ip 주소 에서 기자에게 변수를 설정하고 싶습니다 . 그러나 리포터 설정을위한 플레이 북은 [collectors]
그룹에서 실행되지 않으므로이 호스트에 대한 사실은 수집되지 않습니다. IP 주소를 하드 코딩하지 않는 방법이 있습니까?
답변
다음과 같은 작업을 수행하면 거의 모든 인벤토리 사실 / 변수에 액세스 할 수 있습니다.
{{ 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 설명서의 예는 다음과 같습니다.
예를 들어 수천 개의 호스트가있는 매우 큰 인프라를 상상해보십시오. 팩트 캐싱은 야간에 실행되도록 구성 할 수 있지만 소규모 서버 세트 구성은 하루 종일 임시 또는 주기적으로 실행될 수 있습니다. 사실 캐싱을 사용하면 모든 서버를 “히트”하여 변수 및 해당 정보를 참조 할 필요는 없습니다.