web-dev-qa-db-ja.com

Ansible:どのようにディレクトリ内のファイルやフォルダを削除するには?

以下のコードは、Webディレクトリの中にある最初のファイルのみを削除します。 Webディレクトリ内のすべてのファイルとフォルダを削除し、Webディレクトリを保持したいです。どうやってやるの?

  - name: remove web dir contents
     file: path='/home/mydata/web/{{ item }}' state=absent
     with_fileglob:
       - /home/mydata/web/*

注:私はcommandとShellを使ってrm -rfを試しましたが、うまくいきません。おそらく私はそれらを間違って使っています。

正しい方向へのどんな助けでも評価されるでしょう。

Ansible 2.1.0.0を使用しています

117
Abbas

以下のコードはartifact_pathの内容全体を削除します

- name: Clean artifact path
  file:
    state: absent
    path: "{{ artifact_path }}/"

注:これによりディレクトリも削除されます。

121
Mohan Kumar P

シェルモジュールを使う( idempotent も):

- Shell: /bin/rm -rf /home/mydata/web/*

あなたが作成日と所有者/パーミッションを気にしないなら最もクリーンな解決策:

- file: path=/home/mydata/web state=absent
- file: path=/home/mydata/web state=directory
57
helloV

ディレクトリ(基本的に https://stackoverflow.com/a/38201611/1695680 のコピー)を削除します。Anibleはこの操作をフードの下の rmtree で行います。

- name: remove files and directories
  file:
    state: "{{ item }}"
    path: "/srv/deleteme/"
    owner: 1000  # set your owner, group, and mode accordingly
    group: 1000
    mode: '0777'
  with_items:
    - absent
    - directory

ディレクトリ全体を削除して再作成する贅沢がない場合は、ファイル(およびディレクトリ)をスキャンし、それらを1つずつ削除することができます。これはしばらく時間がかかります。あなたはおそらくあなたのansible.cfgに[ssh_connection]\npipelining = Trueがあることを確認したいでしょう。

- block:
  - name: 'collect files'
    find:
      paths: "/srv/deleteme/"
      hidden: True
      recurse: True
      # file_type: any  # Added in ansible 2.3
    register: collected_files

  - name: 'collect directories'
    find:
      paths: "/srv/deleteme/"
      hidden: True
      recurse: True
      file_type: directory
    register: collected_directories

  - name: remove collected files and directories
    file:
      path: "{{ item.path }}"
      state: absent
    with_items: >
      {{
        collected_files.files
        + collected_directories.files
      }}
37
ThorSummoner

下記のコマンドを試してください、それは動作するはずです

- Shell: ls -1 /some/dir
  register: contents

- file: path=/some/dir/{{ item }} state=absent
  with_items: {{ contents.stdout_lines }}
17

私は本当にRMの解決策が好きではなかった、また答えてあなたにRMの使用についての警告を与える。ですから、ここではrmを必要とせずに警告を出さずにそれを行う方法を説明します。

- hosts: all
  tasks:
  - name: Ansible delete file glob
    find:
      paths: /etc/Ansible
      patterns: "*.txt"
    register: files_to_delete

  - name: Ansible remove file glob
    file:
      path: "{{ item.path }}"
      state: absent
    with_items: "{{ files_to_delete.files }}"

ソース: http://www.mydailytutorials.com/ansible-delete-multiple-files-directories-ansible/ /

14
Cris

ファイルグロブを使用しても動作します。投稿したコードに構文エラーがあります。私はこれを機能させるために修正してテストしました。

- name: remove web dir contents
  file:
    path: "{{ item }}"
    state: absent
  with_fileglob:
    - "/home/mydata/web/*"
5
Deepali Mittal

すべてのコメントと提案から、全体的な見直しとフェイルセーフの実装を作成しました。

# collect stats about the dir
- name: check directory exists
  stat:
    path: '{{ directory_path }}'
  register: dir_to_delete

# delete directory if condition is true
- name: purge {{directory_path}}
  file:
    state: absent
    path: '{{ directory_path  }}'
  when: dir_to_delete.stat.exists and dir_to_delete.stat.isdir

# create directory if deleted (or if it didn't exist at all)
- name: create directory again
  file:
    state: directory
    path: '{{ directory_path }}'
  when: dir_to_delete is defined or dir_to_delete.stat.exist == False
4
Markus

Ansibleはまだstate = emptyhttps://github.com/ansible/ansible-modules-core/issues/902を実装することを議論していますが

my_folder: "/home/mydata/web/"
empty_path: "/tmp/empty"


- name: "Create empty folder for wiping."
  file:
    path: "{{ empty_path }}" 
    state: directory

- name: "Wipe clean {{ my_folder }} with empty folder hack."
  synchronize:
    mode: Push

    #note the backslash here
    src: "{{ empty_path }}/" 

    dest: "{{ nl_code_path }}"
    recursive: yes
    delete: yes
  delegate_to: "{{ inventory_hostname }}"

ただし、同期を使用すると、とにかく(削除を使用して)ファイルを正しく同期できるはずです。

2
Marcin

open open これに関して/があります。

今のところ、解決策は私のために働く:ローカルに空のフォルダを作成し、それをリモートのものと同期させる。

これがサンプルプレイブックです。

- name: "Empty directory"
  hosts: *
  tasks:
    - name: "Create an empty directory (locally)"
      local_action:
        module: file
        state: directory
        path: "/tmp/empty"

    - name: Empty remote directory
      synchronize:
        src: /tmp/empty/
        dest: /home/mydata/web/
        delete: yes
        recursive: yes
2
w1100n

私の場合、ディレクトリはファイルシステムなので、findコマンドがディレクトリ内のすべてを削除し、ディレクトリをそのままにしておくようにしたいのです。ファイルシステムを削除しようとすると、システムはエラーを生成しますが、これはNiceオプションではありません。 Shellオプションを使用しているのは、これが私がこれまでこの質問に対して見つけた唯一の有効なオプションだからです。

私がしたこと:

Hostsファイルを編集していくつかの変数を入れます。

[all:vars]
COGNOS_HOME=/tmp/cognos
find=/bin/find

そして、プレイブックを作ります。

- hosts: all
  tasks:
  - name: Ansible remove files
    Shell: "{{ find }} {{ COGNOS_HOME }} -xdev -mindepth 1 -delete"

これにより、COGNOS_HOME変数directory/filesystem内のすべてのファイルとディレクトリが削除されます。 "-mindepth 1"オプションは、現在のディレクトリに触れないようにします。

1
Tjerk Maij

Ansible> = 2.3(ファイルとディレクトリの区別は不要になった場合)

- name: Collect all fs items inside dir
  find:
    path: "{{ target_directory_path }}"
    hidden: true
    file_type: any
  changed_when: false
  register: collected_fsitems
- name: Remove all fs items inside dir
  file:
    path: "{{ item.path }}"
    state: absent
  with_items: "{{ collected_fsitems.files }}"
  when: collected_fsitems.matched|int != 0
0
Enno Gröper
  - name: delete old data and clean cache
    file:
      path: "{{ item[0] }}" 
      state: "{{ item[1] }}"
    with_nested:
      - [ "/data/server/{{ app_name }}/webapps/", "/data/server/{{ app_name }}/work/" ]
      - [ "absent", "directory" ]
    ignore_errors: yes
0
lanni654321

あなたがいつもLinuxにいると仮定して、find cmdを試してください。

- name: Clean everything inside {{ item }}
  Shell: test -d {{ item }} && find {{ item }} -path '{{ item }}/*' -Prune -exec rm -rf {} \;
  with_items: [/home/mydata/web]

これは/home/mydata/webの下に隠されたファイル/フォルダ/を一掃するはずです

0
Sherzod Odinaev

これは私の例です。

  1. リポジトリをインストールする
  2. Rsyslogパッケージをインストールする
  3. rsyslogを停止します
  4. / var/log/rsyslog /内のすべてのファイルを削除します
  5. rsyslogを開始します

    - hosts: all
      tasks:
        - name: Install rsyslog-v8 yum repo
          template:
            src: files/rsyslog.repo
            dest: /etc/yum.repos.d/rsyslog.repo
    
        - name: Install rsyslog-v8 package
          yum:
            name: rsyslog
            state: latest
    
        - name: Stop rsyslog
          systemd:
            name: rsyslog
            state: stopped
    
        - name: cleann up /var/spool/rsyslog
          Shell: /bin/rm -rf /var/spool/rsyslog/*
    
        - name: Start rsyslog
          systemd:
            name: rsyslog
            state: started
    
0
Satish

以下に従ってください:

- hosts: all
  tasks:
    - name: Empty remote directory
      file:
        path: /home/felipe/files
        state: absent
      become: yes

    - name: Create
      file:
        path: /home/felipe/files
        state: directory
        owner: jboss
        group: jboss
        mode: u=rwx,g=rx,o=rx
      become: yes
0
felipealves.gnu

私は年齢、タイムスタンプ、グロブパターンなどのような複数のフィルタに基づいてファイルをクリーンアップするためのカスタムansibleモジュールを書きました.

それはまた信頼できる古いバージョンと互換性があります。 ここ で見つけることができます。

これが一例です。

- cleanup_files:
  path_pattern: /tmp/*.log
  state: absent
  excludes:
    - foo*
    - bar*
0
Rahul