-vvv 로 보면 다음과같이 setup.py 를 실행하게 된다.
/usr/bin/python /home/ysoftman/.ansible/tmp/ansible-tmp-1487557897.51-276619114541988/setup.py; rm -rf "/home/ysoftman/.ansible/tmp/ansible-tmp-1487557897.51-276619114541988/" > /dev/null 2>&1'"'"'"'"'"'"'"'"' && sleep 0'"'"''
그런데 ansible 실행시 sudo(root)로 하면 setup.py 실행에서 몇분간 지체되는 현상이 발생했다. 특정 서버에서만 발생하는것으로 대상 서버의 root 환경과 문제가 있는것으로 보인다.
우선 대상 호스트에서 setup.py 이 실행되면
setup.py --> /tmp/ansible_xxx/ -> ansible_modlib.zip 과 ansible_module_setup.py 이 생성하게 된다.
ansible_module_setup.py 에 문제가 있고 다음과 같이 이것만 테스트 해볼 수 있다.
1. ansible_modlib.zip 과 ansible_module_setup.py 를 홈디렉토리에 복사한다.
2. ansible_modlib.zip 은 압축을 해제하면 ansible_module_setup.py 를 실행 할 수 있다.
3. 다음과 같이 json 인자 값을 주어 실행한다.
sudo python ./ansible_module_setup.py '{"ANSIBLE_MODULE_ARGS": {"_ansible_version": "2.2.1.0", "_ansible_selinux_special_fs": ["fuse", "nfs", "vboxsf", "ramfs"], "_ansible_no_log": false, "gather_timeout": 10, "_ansible_module_name": "setup", "_ansible_verbosity": 3, "_ansible_syslog_facility": "LOG_USER", "gather_subset": "all", "_ansible_diff": false, "_ansible_debug": false, "_ansible_check_mode": false}}'
각 단계를 따라가면서 print 하여 오래걸리는 구간을 찾아봤는데
ansible_modlib.zip 을 압축해제 후 생성된 ansible/module_utils/facts.py -> ansible_facts() 함수에서 subset 이 hardware 인 경우가 업데이트가 느려지게 된다. 아래와 코드의 주석을 해제하여 hardward 일 경우 스킵하면 기다림 없이 진행되더라.
def ansible_facts(module, gather_subset):
facts = {}
facts['gather_subset'] = list(gather_subset)
facts.update(Facts(module).populate())
for subset in gather_subset:
print subset
# if subset == 'hardware':
# continue
facts.update(FACT_SUBSETS[subset](module,
load_on_init=False,
cached_facts=facts).populate())
return facts
ansible 문서 http://docs.ansible.com/ansible/intro_configuration.html 를 찾아보니 다음과 같이 gather_subset = all 기본 설정되어 hardware 의 경우 검색시 오랜 시간이 걸리 수 있다고 나와 있다.
all: gather all subsets (the default)
network: gather network facts
hardware: gather hardware facts (longest facts to retrieve)
virtual: gather facts about virtual machines hosted on the machine
ohai: gather facts from ohai
facter: gather facts from facter
플레이북에서 hardware 를 빼고 다음과 같이 명시하니 기다림 없이 진행되는것을 확인했다.
gather_subset: network,virtual
또는
gather_facts: False
로 setup.py 자체를 실행하지 않으면 된다.
최초 한번은 시간이 오래 걸리더라도 gather_facts: True (gather_subset: all 디폴트)로 모두 설치해주자.
comments:
댓글 쓰기