it-swarm.com.ru

Как удалить * .web файлы, только если они существуют

Мне нужно создать Ansible playbook для удаления файлов *.web в определенном каталоге, только если файлы существуют.

ОС: центовая ОС, Redhat 5x, 6x.

Я пробовал следующее безуспешно:

 - stat: path=/opt/app/jboss/configuration/*.web
   register: web
 - Shell: rm -rf /opt/app/jboss/configuration/*.web
   when: web.stat.exists
5
miki

Ответ @ bruce-p выдает предупреждение об устаревании с Ansible 2.0+, но новый with_fileglob дает другой вариант:

- file: path={{ item }} state=absent
  with_fileglob: /opt/app/jboss/configuration/*.web

(Подобный вопрос удалить все файлы, содержащие определенное имя в каталоге имеет аналогичный ответ.)

Правка: Как отмечено ниже, это не будет работать; Вот пример «причудливого пути»:

- find:
    paths: /opt/app/jboss/configuration
    patterns: "*.web"
  register: find_results

- file:
    path: "{{ item['path'] }}"
    state: absent
  with_items: "{{ find_results['files'] }}"
14
Josh Smift

Модуль stat не работает с подстановочными знаками, поэтому первое задание не будет выполнять то, что вы ожидаете. Большинство модулей Ansible не поддерживают подстановочные знаки *, ? и т.д. В своих параметрах, если они явно не задокументированы. Причина этого в том, что расширение подстановочного знака обычно обрабатывается вашей регистрационной оболочкой (bash, zsh и т.д.), Поэтому, если приложение явно не поддерживает его, оно не сможет их распознать.

Вот простой способ убедиться в этом:

tasks:
  - stat: path=/etc/*.conf
    register: foo

  - debug: var=foo

  - stat: path=/etc/resolv.conf
    register: bar

  - debug: var=bar

Результат этого:

ok: [localhost] => {
    "var": {
        "foo": {
            "changed": false,
            "invocation": {
                "module_args": "path=/etc/*.conf",
                "module_complex_args": {},
                "module_name": "stat"
            },
            "stat": {
                "exists": false
            }
        }
    }
}

TASK: [stat path=/etc/resolv.conf] ********************************************
ok: [localhost]

TASK: [debug var=bar] *********************************************************
ok: [localhost] => {
    "var": {
        "bar": {
            "changed": false,
            "invocation": {
                "module_args": "path=/etc/resolv.conf",
                "module_complex_args": {},
                "module_name": "stat"
            },
            "stat": {
                "atime": 1446665095.0724516,
                "checksum": "fd75f8cc67e4879fa546cbbd901b211bcb7e1b5e",
                "ctime": 1446840004.4182615,
                "dev": 51713,
                "exists": true,
                "gid": 0,
                "gr_name": "root",
                "inode": 146096,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "md5": "a56ca5f7379429d3b358ce922b28039b",
                "mode": "0644",
                "mtime": 1446840004.4182615,
                "nlink": 1,
                "path": "/etc/resolv.conf",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 94,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            }
        }
    }
}

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

Как и подразумевал @udondan в своем ответе, вы можете просто сделать что-то вроде этого:

- Shell: rm -rf /opt/app/jboss/configuration/*.web

Так как rm будет молча завершаться без ошибок, если будет 0 совпадений.

Если вы действительно хотите проявить фантазию, вы можете использовать модуль find , чтобы найти все файлы, соответствующие вашему шаблону, а затем вызвать команду rm (или, что еще лучше, использовать модуль file module и установить state=absent), используя цикл with_items для циклического повторения того, что возвращает find.

2
Bruce P

rm -rf не заботится о том, существуют файлы или нет. Это не будет жаловаться. Если файлы существуют, они будут удалены. Если нет, то нет. Но результат тот же: тот же код состояния, но не вывод. Тогда нет необходимости иметь дело с этим на уровне Ansible.

0
udondan