2016-12-29 8 views
0

Im, создавая учебник для развертывания для наших веб-сервисов. Каждый веб-сервис находится в своем собственном каталоге, таких как: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 не работают, поскольку анзибль 2.2, так что вы должны шаблон их.

+1

Хорошее использование фильтрации джиньи, в частности, карты() и фильтров списка, это подход, который я раньше не видел. –

+0

Это довольно ударило о том, что я ищу. Благодаря! – R4F6

1

Это позволит получить список существующих имен каталогов в переменную список dir_names (используйте recurse: no, чтобы читать только первый уровень под webapps):

--- 

- 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 

Затем вы можете использовать dir_names в задаче «Остановить службы» с помощью команды with_items. Похоже, что вы намерены использовать только имя каталога под «WebApps», так что вы, вероятно, хотите использовать | basename jinja2 фильтр, чтобы получить это, так что-то вроде этого:

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

используя @ janja фильтры Konstantin пример, вы можете пропустить set_fact в моем ответе и просто использовать '' {{tmp_dirs ['files'] | map (attribute = 'path') | list}} "' в службах stop Задача –

 Смежные вопросы

  • Нет связанных вопросов^_^