728x90
요즘 앤서블을 공부하면서 조금 신기했던 내용을 좀 담으려 한다.
책을 보며 공부하는 과정에서 책은 버츄얼박스로 실습을 했는데 난 컴퓨터가 좋지 않아 AWS로 했다.
그러다 보니 조금 일부의 다른 점들의 설정들을 찾아 수정해서 해야 했다.
그중에 신기한 Facts 수집 타이밍 문제
에 대해서 작성하려 한다.
1번 코드 (책)
---
- hosts: tnode
gather_facts: yes
roles:
- role: geerlingguy.java
- role: geerlingguy.elasticsearch
- role: geerlingguy.kibana
2번 코드(수정)
---
- hosts: tnode
gather_facts: yes
pre_tasks:
- name: Wait for facts
debug:
msg: "Waiting for facts to be gathered"
roles:
- role: geerlingguy.java
- role: geerlingguy.elasticsearch
- role: geerlingguy.kibana
문제점
이 룰은 책에서 알려준 앤서블 갤럭시에서 받은 룰이다.
그리고 위에 1번 2번은 이 룰들을 실행하는 파일이다.
근데 실행을 하면 실행되는 룰 안에 tasks/main.yml
파일을 보면 ansible_distribution
시스템 정보를 호출해서 확인하는 코드가 있다.
- name: Include OS-specific variables for Fedora or FreeBSD.
include_vars: "{{ ansible_distribution }}.yml"
when: ansible_distribution == 'FreeBSD' or ansible_distribution == 'Fedora'
근데 이상하게 ansible_distribution
를 불러오지 못한다는 에러가 계속해서 발생한다.
원인
생각도 못했던 문제였다. 구체적으로 설명을 적어보면,
gather_facts
는 시스템 정보를 불러온다.ansible_distribution
는 시스템 정보 중에 하나이다.- facts 수집이 완전히 끝나기전에 실행이 되서
ansible_distribution
변수를 찾을 수 없다는 에러가 발생하는 거였다.
해결 방안
- tasks 섹션을 추가해서 facts수집 시간을 확보한다.이렇게 되면 gather_facts이 실행되면서 이 tasks가 모두 수집되어야 다음 roles로 넘어가기 때문이다.
- hosts: tnode
gather_facts: yes
tasks: # tasks가 먼저 실행됨
- name: Debug ansible_distribution
debug:
var: ansible_distribution
roles: # 그 다음 roles가 실행됨
- role: geerlingguy.java
- ...
- pre_tasks 은 사전작업이다. 사전작업을 통해 잠깐의 시간지연을 시킴에 따라 바로 roles가 실행되지 않게 하여 시간을 지연 시켜 정보를 수집한다.
---
- hosts: tnode
gather_facts: yes
pre_tasks:
- name: Wait for facts
debug:
msg: "Waiting for facts to be gathered"
roles:
- role: geerlingguy.java
- role: geerlingguy.elasticsearch
- role: geerlingguy.kibana
끗!
728x90