Ansible отправляет файл в первый встреченный пункт назначения

Я отправляю файл конфигурации для тысяч узлов, из-за некоторых настроек может быть 5 или 6 путей к этому файлу (есть только один файл для хоста, но путь может варьироваться), и нет простого способа выяснить местоположение по умолчанию с фактами.

Исходя из этого, я ищу способ установить «назначение» модуля копирования, как мы можем установить «src», с помощью with_first_foundцикл.

Что-то такое:

copy: src=/foo/{{ ansible_hostname }}/nrpe.cfg dest="{{item}}
with_items:
    - "/etc/nagios/nrpe.cfg"
    - "/usr/local/nagios/etc/nrpe.cfg"
    - "/usr/lib64/nagios/etc/nrpe.cfg"
    - "/usr/lib/nagios/etc/nrpe.cfg"
    - "/opt/nagios/etc/nrpe.cfg"

PS: я отправляю nrpe.cfg, так что если кто-то знает лучший способ найти, где находится nrpe.cfg по умолчанию, это будет намного проще.

РЕДАКТИРОВАТЬ 1: мне удалось поработать с помощью @ydaetskcoR следующим образом:

- name: find nrpe.cfg
  stat:
    path: "{{ item }}"
  with_items:
    - "/etc/nagios/nrpe.cfg"
    - "/usr/local/nagios/etc/nrpe.cfg"
    - "/usr/lib64/nagios/etc/nrpe.cfg"
    - "/usr/lib/nagios/etc/nrpe.cfg"
    - "/opt/nagios/etc/nrpe.cfg"
  register: nrpe_stat
  no_log: True

- name: Copy nrpe.cfg
  copy: src=/foo/{{ ansible_hostname }}/nrpe.cfg dest="{{item.stat.path}}"
  when: item.stat.exists
  no_log: True
  with_items:
    - "{{nrpe_stat.results}}"

person Bernardo Vale    schedule 17.12.2015    source источник


Ответы (1)


Одним из вариантов может быть просто поиск уже существующего файла nrpe.cfg, а затем регистрация этого местоположения в качестве переменной, которая будет использоваться для задачи копирования.

Вы можете сделать это либо с помощью задачи оболочки/команды, которая просто использует find, либо перебрать кучу местоположений с помощью stat чтобы проверить, существуют ли они.

Итак, у вас может быть что-то вроде этого:

- name: find nrpe.cfg
  shell: find / -name nrpe.cfg
  register: nrpe_path

- name: overwrite nrpe.cfg
  copy: src=/foo/{{ ansible_hostname }}/nrpe.cfg dest="{{item}}"
  with_items:
    - nrpe_path.stdout_lines
  when: nrpe_path.stdout != ""
  register: nrpe_copied

- name: copy nrpe.cfg to box if not already there
  copy: src=/foo/{{ ansible_hostname }}/nrpe.cfg dest="{{ default_nrpe_path }}"
  when: nrpe_copied is not defined

Как указал Mxx в комментариях, у нас есть третья задача, чтобы вернуться к копированию по некоторому пути по умолчанию (потенциально /etc/nagios/ или любой другой путь), если файл nrpe.cfg не был найден find.

Чтобы использовать stat вместо задачи оболочки/команды, вы можете сделать что-то вроде этого:

- name: find nrpe.cfg
  stat: 
    path: {{ item }}
  with_items:
    - "/etc/nagios/nrpe.cfg"
    - "/usr/local/nagios/etc/nrpe.cfg"
    - "/usr/lib64/nagios/etc/nrpe.cfg"
    - "/usr/lib/nagios/etc/nrpe.cfg"
    - "/opt/nagios/etc/nrpe.cfg"
  register: nrpe_stat

- name: overwrite nrpe.cfg
  copy: src=/foo/{{ ansible_hostname }}/nrpe.cfg dest="{{item.stat.path}}"
  when: item.stat.exists
  with_items:
    - "{{nrpe_stat.results}}"
person ydaetskcoR    schedule 17.12.2015
comment
Привет @ydaetskcoR, это то, чем я сейчас занимаюсь, но я пытаюсь найти решение без оболочки, поэтому я мог бы использовать --check - person Bernardo Vale; 18.12.2015
comment
Я добавил первый штрих к тому, что вам может понадобиться для использования статистики вместо этого, но у меня нет времени протестировать его, а затем настроить, чтобы он работал. Если вы можете решить это самостоятельно, не стесняйтесь предлагать редактирование, в противном случае я попытаюсь еще раз взглянуть на это, когда у меня будет свободное время. - person ydaetskcoR; 18.12.2015
comment
Спасибо за вашу помощь. Я отредактировал свой пост, чтобы поделиться своим последним усилием. Теперь проблема в том, что --diff больше не работает. - person Bernardo Vale; 18.12.2015
comment
Не знаю почему, но сейчас работает. Еще раз спасибо за помощь - person Bernardo Vale; 18.12.2015
comment
Я имел в виду предложить отредактировать ответ. Я добавил это в себя, хотя. Спасибо, что закончили. - person ydaetskcoR; 18.12.2015
comment
Но это не скопирует файл, если он полностью отсутствует на целевом сервере. - person Mxx; 18.12.2015
comment
Хорошая точка зрения. Я обновил исходный пример, чтобы зарегистрировать переменную при перезаписи nrpe.cfg, а затем выполнить резервную задачу, которая помещает nrpe.cfg в путь по умолчанию, если он еще не скопировал nrpe.cfg. Нужно обновить и вторую часть, когда у меня будет шанс. - person ydaetskcoR; 18.12.2015