0

ディレクトリ my_dir 内のすべてのファイルを削除する 2 つの方法を試しています。これは、別のファイルから管理されるパラメータです。私のワークフローは、最初にディレクトリを作成し、次にそのディレクトリにファイルをコピーしてから、そこにあるすべてのファイルを削除します。だからここに loop_control を使った私の最初の解決策があります:

---
# tasks file for deploy_files

- name: Create model directory
  file:
    path: "{{ my_dir }}"
    state: directory
    owner: "{{ my_daemon_name }}"
    group: "{{ my_daemon_name }}"
    mode: u=rwx,g=rX,o=rX

- name: Copy models
  copy:
    src: "{{ files_src_dir }}"
    dest: "{{ my_dir }}"
    owner: "{{ my_daemon_name }}"
    group: "{{ my_daemon_name }}"
    mode: u=rw,g=r,o=r

- name: Get directory listing
  find:
    path: "{{ my_dir }}"
    file_type: any
    hidden: yes
  register: directory_content_result

- name: Remove directory content
  file:
    path: "{{ item.path }}"
    state: absent
    owner: "{{ my_daemon_name }}"
    group: "{{ my_daemon_name }}"
    mode: u=rw,g=r,o=r
  with_items: "{{ directory_content_result.files }}"
  loop_control:
    label: "{{ item.path }}"

そして、これは loop_control を使用しない 2 番目のソリューションです。

    ---
    # tasks file for deploy_files
    
    - name: Create model directory
      file:
        path: "{{ my_dir }}"
        state: directory
        owner: "{{ my_daemon_name }}"
        group: "{{ my_daemon_name }}"
        mode: u=rwx,g=rX,o=rX
    
    - name: Copy models
      copy:
        src: "{{ files_src_dir }}"
        dest: "{{ my_dir }}"
        owner: "{{ my_daemon_name }}"
        group: "{{ my_daemon_name }}"
        mode: u=rw,g=r,o=r

- name: Find files in directory
  find:
    path: "{{ my_dir }}"
  register: files_to_delete

- name: Remove files in directory
  file:
    path: "{{ item.path }}"
    state: absent
    owner: "{{ my_daemon_name }}"
    group: "{{ my_daemon_name }}"
    mode: u=rwx,g=rX,o=rX
  with_items: "{{ files_to_delete.files }}"

スクリプトを実行したときと同じように機能するものはありません。

エラー: 次のタスクのため、冪等性テストに失敗しました。

AnsibleERR1

私のタスク Create model directory と Copy models は、既にテスト済みなので、完全に正常に動作することに注意してください。ファイルを削除する最後の 2 つのタスクを追加したときにのみ、スクリプトが失敗しました。誰かが私がここで間違ったことを手伝ってくれませんか? ありがとうございました。

4

1 に答える 1

1

プレイブックに技術的な問題はなく、実際に要求どおりに動作しています。

プレイブックの実行方法についてまったく言及していないため、推測する必要がありますがmolecule、プレイブック/ロールをテストするために使用していると確信しています(ちなみに、これは非常に良い考えです)。そして、あなたの質問に示されているのは、そのチェックにmolecule失敗しています。idempotence

何が起こるかというと、Playbook を 2 度目に実行すると、(前のステップmoleculeを実行することによって) 目的の状態に既に調整されているはずなので、リモート ターゲットで何も変更されないことが期待されます。converge

プレイブックは無条件にファイルを作成して削除するため、常にターゲット上の何かが変更され、そのチェックは決してパスしません。冪等になるようにこれらすべての方法を変更するか、それらが関連していないことがわかっている場合はそれらのタスクの変更を無視する必要があります(つまりchanged_when: false)。

経験上、最善の選択肢は通常、可能な限り冪等にすることです。

于 2020-11-16T10:00:27.700 に答える