2016-12-29 3 views
0

웹 서비스 용 배포 가이드를 만듭니다. 각 웹 서비스는 다음과 같은 자신의 디렉토리에 있습니다 :Ansible - 여러 디렉토리가 있는지 확인 - 각 디렉토리에서 스크립트를 실행하는 경우 - 어떻게?

/webapps/service-one/ 
/webapps/service-two/ 
/webapps/service-three/ 

내가 서비스 디렉토리가 존재하는지 확인하려면, 그렇다면, 나는 정상적으로 서비스를 중지 쉘 스크립트를 실행합니다. 현재 ignore_errors: yes을 사용하여이 단계를 완료 할 수 있습니다.

- name: Stop services 
    with_items: services_to_stop 
    shell: "/webapps/scripts/stopService.sh {{item}}" 
    ignore_errors: yes 

이 방법이 효과가 있지만 디렉토리 중 하나가 존재하지 않거나 서비스가 처음으로 배포되는 경우 출력이 매우 혼란 스럽습니다. 나는 효과적으로 이들 중 하나 같은 것을 원하는 :

이 :

- name: Stop services 
    with_items: services_to_stop 
    shell: "/webapps/scripts/stopService.sh {{item}}" 
    when: shell: [ -d /webapps/{{item}} ] 

나이 :

- name: Stop services 
    with_items: services_to_stop 
    shell: "/webapps/scripts/stopService.sh {{item}}" 
    stat: 
    path: /webapps/{{item}} 
    register: path 
    when: path.stat.exists == True 

답변

3

나는 사실을 수집하는 것 먼저 필요한 것을하십시오.

- name: Check existing services 
    stat: 
    path: "/tmp/{{ item }}" 
    with_items: "{{ services_to_stop }}" 
    register: services_stat 

- name: Stop existing services 
    with_items: "{{ services_stat.results | selectattr('stat.exists') | map(attribute='item') | list }}" 
    shell: "/webapps/scripts/stopService.sh {{ item }}" 

또한 당신이 그들을 템플릿을해야하므로 with_items에 노출 된 변수는, Ansible 2.2 이후 작동하지 않는 것을 유의하십시오.

+1

jinja 필터링, 특히 map() 및 목록 필터를 사용하는 것이 좋습니다. 이전에 보지 못했던 방식입니다. –

+0

이것은 내가 찾고있는 것에 꽤 상상합니다. 감사! – R4F6

1

이것은 당신이 목록 변수 dir_names (에 기존 디렉토리 이름의 목록을 얻을 수있게된다 웹 응용 프로그램에서 첫 번째 수준 만 읽으려면 recurse: no을 사용하십시오.) :

--- 

- hosts: localhost 
    connection: local 
    vars: 
    dir_names: [] 

    tasks: 
    - find: 
     paths: "/webapps" 
     file_type: directory 
     recurse: no 
     register: tmp_dirs 
    - set_fact: dir_names="{{ dir_names+ [item['path']] }}" 
     no_log: True 
     with_items: 
     - "{{ tmp_dirs['files'] }}" 

    - debug: var=dir_names 

그런 다음 with_items를 통해 "서비스 중지"작업에서 dir_names을 사용할 수 있습니다. 당신은 아마를 얻기 위해 | basename jinja2 필터를 사용할 수 있도록 "웹 어플리케이션"에서 디렉토리의 이름을 사용하려는 것 같습니다, 그래서 이런 식으로 뭔가 :

- name: Stop services 
    with_items: "{{ dir_names }}" 
    shell: "/webapps/scripts/stopService.sh {{item | basename }}" 
+1

@ Konstantin의 jinja 필터 예제를 사용하면 내 대답에서 set_fact를 건너 뛰고 stop 서비스에서'{{tmp_dirs [ 'files'] | map (attribute = 'path') | list}} ''를 사용할 수 있습니다. 작업 –