以下のコードは、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を使用しています
以下のコードはartifact_pathの内容全体を削除します
- name: Clean artifact path
file:
state: absent
path: "{{ artifact_path }}/"
注:これによりディレクトリも削除されます。
シェルモジュールを使う( idempotent も):
- Shell: /bin/rm -rf /home/mydata/web/*
あなたが作成日と所有者/パーミッションを気にしないなら最もクリーンな解決策:
- file: path=/home/mydata/web state=absent
- file: path=/home/mydata/web state=directory
ディレクトリ(基本的に 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
}}
下記のコマンドを試してください、それは動作するはずです
- Shell: ls -1 /some/dir
register: contents
- file: path=/some/dir/{{ item }} state=absent
with_items: {{ contents.stdout_lines }}
私は本当に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/ /
ファイルグロブを使用しても動作します。投稿したコードに構文エラーがあります。私はこれを機能させるために修正してテストしました。
- name: remove web dir contents
file:
path: "{{ item }}"
state: absent
with_fileglob:
- "/home/mydata/web/*"
すべてのコメントと提案から、全体的な見直しとフェイルセーフの実装を作成しました。
# 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
Ansibleはまだstate = empty
https://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 }}"
ただし、同期を使用すると、とにかく(削除を使用して)ファイルを正しく同期できるはずです。
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
私の場合、ディレクトリはファイルシステムなので、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"オプションは、現在のディレクトリに触れないようにします。
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
- 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
あなたがいつも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
の下に隠されたファイル/フォルダ/を一掃するはずです
これは私の例です。
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
以下に従ってください:
- 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
私は年齢、タイムスタンプ、グロブパターンなどのような複数のフィルタに基づいてファイルをクリーンアップするためのカスタムansibleモジュールを書きました.
それはまた信頼できる古いバージョンと互換性があります。 ここ で見つけることができます。
これが一例です。
- cleanup_files:
path_pattern: /tmp/*.log
state: absent
excludes:
- foo*
- bar*