web-dev-qa-db-fra.com

Comment supprimer les fichiers * .web uniquement s'ils existent

Je dois créer un livre de lecture Ansible pour supprimer les fichiers *.web d'un répertoire spécifique uniquement si les fichiers existent.

OS: cent OS, Redhat 5x, 6x.

J'ai essayé ce qui suit sans succès:

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

La réponse de @ bruce-p donne un avertissement de dépréciation avec Ansible 2.0+, mais le nouveau with_fileglob donne une autre option:

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

(Question similaire supprime tous les fichiers contenant un certain nom dans un répertoire a une réponse similaire.)

EDIT: Comme indiqué ci-dessous, cela ne fonctionnera pas; voici un exemple de "la manière de fantaisie":

- 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

Le module stat ne fonctionne pas avec les caractères génériques, la première tâche ne fera pas ce que vous attendez. La plupart des modules Ansible ne prennent pas en charge les caractères génériques *, ?, etc. sauf indication contraire explicite. La raison en est que l'expansion des caractères génériques est généralement gérée par votre shell de connexion (bash, zsh, etc.). Par conséquent, à moins que l'application ne la prenne explicitement en charge, elle ne les reconnaîtra pas.

Voici un moyen facile de vérifier cela:

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

  - debug: var=foo

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

  - debug: var=bar

La sortie de ceci est:

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
            }
        }
    }
}

Notez que lorsque vous spécifiez un seul fichier, il renvoie les résultats de ce fichier, mais lorsque vous spécifiez un caractère générique, il ne renvoie en principe rien.

Comme @udondan l'a laissé entendre dans sa réponse, vous pouvez faire quelque chose comme ceci:

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

Puisque rm se terminera silencieusement sans erreur s'il y a 0 correspondances.

Si vous voulez vraiment avoir envie, vous pouvez utiliser le module find pour localiser tous les fichiers correspondant à votre modèle, puis appeler la commande rm (ou, mieux encore, utiliser le fichier file module et définir state=absent) à l'aide d'un with_items boucle pour boucler ce que find retourne.

2
Bruce P

rm -rf ne se soucie pas de savoir si les fichiers existent ou non. Ça ne va pas se plaindre. Si les fichiers existent, ils seront supprimés. Si non, alors non. Mais le résultat est le même: même code d'état, pas de sortie. Pas besoin de traiter cela au niveau Ansible alors.

0
udondan