2017-01-19 13 views
0

를 사용하여 : ansible 2.2.0.0, 내가 실행이 JSON을 반환하는 인벤토리 스크립트가 & 2.1.4.0ansible 반환 잘못된 바르 테스트 동적 재고

2.2.1.0 (예를 위해서 최소화) :

{ 
    "componentA-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host2.example.com" 
    ], 
    "vars": { 
     "httpport": "8100", 
     "nginxpool": "componentA_pool" 
    } 
    }, 
    "componentB-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host3.example.com" 
    ], 
    "vars": { 
     "httpport": "9999", 
     "nginxpool": "componentB_pool" 
    } 
    } 
} 

필자가 작성중인 안내서는 응용 프로그램을 배포하기위한 것입니다. 인벤토리의 변수는 그룹별로 고유합니다. 즉, 각 서비스에는 자체 lb 풀과 http 포트가 있습니다. 또한 한 호스트에 여러 응용 프로그램이있을 수 있습니다. 단순히 변수 nginxpool 및 HTTPPORT 출력한다 역할에

--- 
- hosts: all 
    remote_user: deployment 
    become: true 
    become_method: sudo 
    become_user: root 
    gather_facts: yes 
    serial: 1 
    roles: 
    - app-deploy 

하는 작업 : 그리고 여기에 플레이 북처럼 좋아하는 것입니다.

나는이 같은 작전을 실행

ansible-playbook deploy.yml -i inventory.py --limit componentA-service_ci 

예상 결과 :

TASK [app-deploy : debug] ****************************************************** 
ok: [host1.example.com] => { 
    "msg": "pool componentA_pool port 8100" 
} 

TASK [app-deploy : debug] ****************************************************** 
ok: [host2.example.com] => { 
    "msg": "pool componentA_pool port 8100" 
} 

실제 결과 :

TASK [app-deploy : debug] ****************************************************** 
ok: [host1.example.com] => { 
    "msg": "pool componentB_pool port 9999" 
} 

TASK [app-deploy : debug] ****************************************************** 
ok: [host2.example.com] => { 
    "msg": "pool componentA_pool port 8100" 
} 

--limit 작품을 해당 구성 요소가 componentA-service_ci에 대해 나열된 호스트에 배포되지만 host1.example.com에 대해서는 componentB-service_ci vars에서 nginxpool 및 httpport 값을 얻게됩니다. 나는 documentation을 읽었지만 어떻게 될지 이해하지 못합니까? 이게 버그 야? 아니면 내가 얼마나 유능한가?

+0

[특정 호스트 그룹에서 실행 가능] (http://stackoverflow.com/questions/41500463/run-ansible-on-specific-hosts-group) 가능한 복제본 – techraf

답변

0

필자는 중요한 것은 먼저 전체 인벤토리를 작성한 다음 사용자의 한계에 맞는 재생을 검색한다는 것입니다.

호스트 (host1.example.com)는 동일한 변수를 지정하는 두 그룹에 속하므로 인벤토리를 설정하는 동안 정보가 섞여 나옵니다. host1.example.com 변수 인 httpport의 내용은 componentA- 그룹 또는 componentB- 그룹 일 수 있습니다. 재고가 구축 된 후

, ansible는 변수 이름이 고유 있도록 변수 이름을 변경 지정된 제한 그룹

에서 그 포함 된 호스트에 연극을 제한하고 특정 그룹 내에서 특정 변수 이름을 사용하려고 연극 :

{ 
    "componentA-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host2.example.com" 
    ], 
    "vars": { 
     "componentA_httpport": "8100", 
     "componentA_nginxpool": "componentA_pool" 
    } 
    }, 
    "componentB-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host3.example.com" 
    ], 
    "vars": { 
     "componentB_httpport": "9999", 
     "componentB_nginxpool": "componentB_pool" 
    } 
    } 
} 

이제 호스트 host1.example.com 네 개의 변수 componentA_httpport, componentA_nginxpoolcomponentB_httpport, componentB_nginxpool있다.

+0

통찰력을위한 Thx. 나중에이 문제를 github에서 발견했습니다. https://github.com/ansible/ansible/issues/9065 저는 이것이 버그라고 생각합니다. 다른 변수 이름을 사용하는 것이 일반용 플레이 북이므로 작동하지 않을 것입니다. 래퍼 스크립트는 가능한 플레이 북을 실행하고 변수를 여분의 변수로 주입하기 전에 찾아보기를 수행합니다. –