【例で解説】Ansible win_fileでファイル/ディレクトリを操作するプログラミング

2025-05-27

    • 指定したパスに新しいファイルを作成します。
    • 必要に応じて、ファイルの内容や属性(読み取り専用など)を設定することも可能です。
  1. ファイルのタイムスタンプ更新 (Touches files)

    • 既存のファイルの最終アクセス時刻と最終更新時刻を現在時刻に更新します。
    • ファイルが存在しない場合は、空の新しいファイルを作成することもできます。これは、ファイルの存在を確認したり、特定のイベントのトリガーとして利用したりするのに便利です。
  2. ファイルやディレクトリの削除 (Removes files or directories)

    • 指定したパスにあるファイルやディレクトリを削除します。
    • ディレクトリを削除する際には、そのディレクトリが空である必要があるか、または再帰的に内部のファイルやサブディレクトリも削除するかどうかを指定できます。

このモジュールを利用することで、Windows 環境におけるファイル管理を自動化し、構成管理を効率的に行うことができます。例えば、アプリケーションのログファイルを定期的にローテーションしたり、一時ファイルをクリーンアップしたり、特定の構成ファイルをデプロイしたりする際に役立ちます。

例として、C:\temp ディレクトリに example.txt という空のファイルを作成するタスクは以下のようになります。

- name: Create an empty file
  win_file:
    path: C:\temp\example.txt
    state: touch

また、C:\temp\old_file.txt を削除するタスクは以下のようになります。

- name: Remove a file
  win_file:
    path: C:\temp\old_file.txt
    state: absent


パスの指定に関するエラー

  • エラー
    ディレクトリの作成を試みたが、親ディレクトリが存在しない。


    • state: directorypath: C:\new_parent\new_child を指定したが、C:\new_parent が存在しない。
    • トラブルシューティング
      • 親ディレクトリが存在することを確認してください。
      • 必要であれば、先に win_file モジュールで親ディレクトリを作成するタスクを追加することを検討してください (state: directory).
  • エラー
    指定したパスが存在しない、または形式が正しくない。


    • path: C:\NonExistentFolder\file.txt
    • トラブルシューティング
      • パスが正しく入力されているか、スペルミスがないかを確認してください。
      • リモートホスト上でパスが存在するかどうかを確認してください。
      • UNC パス (\\server\share\path) を使用する場合は、Ansible コントロールノードとターゲットホストの両方からアクセス可能であることを確認してください。
      • 変数をパスに使用している場合は、変数が正しく定義され、期待する値になっているかを確認してください。

権限に関するエラー

  • エラー
    Ansible がターゲットホスト上でファイルやディレクトリの操作を行うための適切な権限を持っていない。

    • ファイルを作成しようとしたが、「アクセスが拒否されました」というエラーが発生する。
    • トラブルシューティング
      • Ansible がターゲットホストに接続する際に使用しているユーザーアカウントが、指定されたパスに対する操作権限を持っているか確認してください。
      • 管理者権限が必要な操作(例:システムドライブの特定の場所への書き込み)の場合は、Ansible の接続方法やユーザーアカウントの設定を見直してください。

state パラメータに関するエラー

  • エラー
    state: absent でディレクトリを削除しようとしたが、ディレクトリが空ではない。


    • state: absent でファイルやサブディレクトリが含まれるディレクトリを削除しようとした。
    • トラブルシューティング
      • ディレクトリが空であることを確認してください。
      • ディレクトリとその内容を再帰的に削除したい場合は、recurse: yes パラメータを追加してください。ただし、この操作は慎重に行ってください。
  • エラー
    state パラメータに無効な値を指定した。


    • state: make_file のように、存在しない値を指定した場合。
    • トラブルシューティング
      • state パラメータには、touchabsentdirectoryfile (非推奨) のいずれかの有効な値を指定してください。公式ドキュメントで正しい値を再確認してください。
  • エラー
    Ansible とターゲットホスト間の接続に問題がある。


    • ネットワークの問題や、WinRM (Windows Remote Management) の設定ミスなど。
    • トラブルシューティング
      • Ansible コントロールノードからターゲットホストへの接続を確認してください (ping コマンドや Ansible の win_ping モジュールなどを使用)。
      • ターゲットホストの WinRM サービスが正しく設定され、起動していることを確認してください。ファイアウォールの設定も見直してください。
  • エラー
    ファイルがロックされているため、操作ができない。


    • 別のプロセスがファイルを使用している状態で、そのファイルを削除しようとした。
    • トラブルシューティング
      • ファイルを使用している可能性のあるプロセスを特定し、停止または終了させてください。
      • 操作のタイミングを調整することを検討してください。

トラブルシューティングの一般的なヒント

  • 冪等性の考慮
    Ansible の重要な原則の一つに冪等性があります。同じタスクを複数回実行しても、常に同じ結果になるように設計することが推奨されます。エラーが発生した場合も、冪等性を意識して再実行を試みることが、問題を解決する上で役立つことがあります。
  • シンプルなテスト
    まずはシンプルな操作(例:空のファイルの作成)で動作確認を行い、徐々に複雑な操作を追加していくことで、問題の切り分けがしやすくなります。
  • 公式ドキュメントの参照
    Ansible の公式ドキュメントは、各モジュールのパラメータや動作について詳しく解説しています。困ったときは、ドキュメントを参照することが非常に役立ちます。
  • エラーメッセージの確認
    表示されたエラーメッセージを注意深く読み、何が問題なのかを理解するように努めてください。
  • 詳細な出力 (verbosity)
    Ansible の実行時に -v-vv-vvv などのオプションを追加することで、より詳細なログ出力を得ることができます。これにより、エラーの原因を特定しやすくなります。


基本的なプレイブックの構成

Ansible のコードは通常、YAML 形式のプレイブックに記述されます。各プレイブックは一つ以上の「プレイ」を含み、各プレイは特定のホストグループに対して実行されるタスクのリストを持ちます。

例1: ファイルの作成

この例では、ターゲットホストの C:\temp ディレクトリに my_new_file.txt という空のファイルを作成します。

- name: Create an empty file
  hosts: windows_servers  # 対象のホストグループ
  tasks:
    - name: Create the file
      win_file:
        path: C:\temp\my_new_file.txt
        state: touch
  • tasks:: このプレイで実行するタスクのリストです。
    • name: Create the file: このタスクの目的を説明する名前です。
    • win_file:: 使用する Ansible モジュールを指定します。
      • path: C:\temp\my_new_file.txt: 作成するファイルの絶対パスを指定します。
      • state: touch: ファイルが存在しない場合は作成し、存在する場合は最終アクセス時刻と最終更新時刻を現在時刻に更新します(この例では作成が主目的です)。
  • hosts: windows_servers: このプレイを実行する対象の Windows ホストグループを指定します。Ansible のインベントリファイルで定義されている必要があります。
  • name: Create an empty file: このプレイの目的を説明する名前です。

例2: ディレクトリの作成

この例では、ターゲットホストの C:\temp ディレクトリに my_new_directory というディレクトリを作成します。

- name: Create a directory
  hosts: windows_servers
  tasks:
    - name: Create the directory
      win_file:
        path: C:\temp\my_new_directory
        state: directory
  • state: directory: 指定されたパスにディレクトリが存在しない場合は作成します。

例3: ファイルの内容を設定して作成

この例では、ターゲットホストの C:\temp ディレクトリに my_config.ini というファイルを作成し、指定した内容を書き込みます。

- name: Create a file with content
  hosts: windows_servers
  tasks:
    - name: Create the configuration file
      win_file:
        path: C:\temp\my_config.ini
        state: file
        content: |
          [Settings]
          timeout=30
          retries=5
  • content:: ファイルに書き込む内容を複数行の文字列として指定します。| はリテラルブロックスタイルを示し、改行がそのまま保持されます。
  • state: file: ファイルが存在しない場合は作成します。ファイルが存在する場合は、content で指定された内容で上書きされます(非推奨。win_copy モジュールなどを検討してください)。

例4: ファイルのタイムスタンプを更新

この例では、ターゲットホストの C:\temp\existing_file.txt という既存のファイルのタイムスタンプを更新します。ファイルが存在しない場合は作成されます。

- name: Touch an existing file
  hosts: windows_servers
  tasks:
    - name: Update the timestamp
      win_file:
        path: C:\temp\existing_file.txt
        state: touch
  • state: touch: ファイルが存在する場合はタイムスタンプを更新し、存在しない場合は空のファイルを作成します。

例5: ファイルの削除

この例では、ターゲットホストの C:\temp\unnecessary_file.txt というファイルを削除します。

- name: Remove a file
  hosts: windows_servers
  tasks:
    - name: Remove the file
      win_file:
        path: C:\temp\unnecessary_file.txt
        state: absent
  • state: absent: 指定されたパスにファイルまたはディレクトリが存在する場合は削除します。

例6: 空でないディレクトリを再帰的に削除

この例では、ターゲットホストの C:\temp\old_directory というディレクトリとその中のすべてのファイルとサブディレクトリを削除します。

- name: Remove a directory recursively
  hosts: windows_servers
  tasks:
    - name: Remove the directory and its contents
      win_file:
        path: C:\temp\old_directory
        state: absent
        recurse: yes
  • recurse: yes: state: absent と組み合わせて使用すると、指定されたディレクトリとそのすべての内容(ファイルとサブディレクトリ)を再帰的に削除します。注意して使用してください。


ファイルの作成と内容の書き込み

  • win_shell または win_command モジュール
    Windows のコマンドレットやコマンドを実行できます。例えば、PowerShell の New-Item コマンドレットを使用してファイルやディレクトリを作成できます。ただし、冪等性の管理は自身で行う必要があります。

    - name: Create a file using PowerShell
      win_shell: |
        New-Item -Path "C:\temp\created_by_powershell.txt" -ItemType File -Force
      register: result
    - debug: var=result
    
    - name: Create a directory using cmd
      win_command: mkdir C:\temp\created_by_cmd
      register: result
    - debug: var=result
    
  • win_template モジュール
    Jinja2 テンプレートエンジンを使用して、変数や条件に基づいて動的にファイルを作成します。設定ファイルの作成など、より複雑な内容を生成する場合に便利です。

    - name: Create a configuration file from a template
      win_template:
        src: templates\my_template.j2
        dest: C:\temp\dynamic_config.ini
        vars:
          timeout: 60
          retries: 10
    
  • win_copy モジュール
    ローカルのファイルを Windows ホストにコピーする際に、コピー先のファイルが存在しない場合は新規作成されます。また、content パラメータを使用すると、ローカルにファイルを用意せずに直接内容を指定してファイルを作成・上書きできます。

    - name: Create a file with content using win_copy
      win_copy:
        dest: C:\temp\another_config.ini
        content: |
          [NewSettings]
          option1=valueA
          option2=valueB
    

ファイルのタイムスタンプ更新 (touch)

  • win_shell または win_command モジュール
    PowerShell の Set-ItemProperty コマンドレットを使用して、LastAccessTime や LastWriteTime を更新できます。

    - name: Update file timestamp using PowerShell
      win_shell: |
        $file = Get-Item "C:\temp\touched_by_powershell.txt"
        $file.LastAccessTime = Get-Date
        $file.LastWriteTime = Get-Date
    

ファイルやディレクトリの削除

  • win_shell または win_command モジュール
    PowerShell の Remove-Item コマンドレットや、rmdir コマンドを使用してファイルやディレクトリを削除できます。再帰的な削除も可能です。

    - name: Remove a file using PowerShell
      win_shell: Remove-Item "C:\temp\deleted_by_powershell.txt" -Force
      register: result
    - debug: var=result
    
    - name: Remove a directory recursively using cmd
      win_command: rmdir /S /Q C:\temp\deleted_by_cmd
      register: result
    - debug: var=result
    
  • win_file モジュール (state: absent)
    これは「win_file」モジュールの主要な機能の一つであり、代替というよりは直接的な方法です。

代替方法の選択に関する考慮事項

  • 既存のコマンドレットやコマンドの利用
    特定の Windows コマンドレットやコマンドの機能を利用したい場合は、win_shellwin_command が有効な選択肢となります。
  • 複雑な操作
    ファイルの内容を動的に生成したり、複雑な条件に基づいてファイルを作成したりする場合は、win_template モジュールが適している場合があります。
  • 可読性
    win_file モジュールはファイル操作の意図が明確で、可読性が高いです。win_shellwin_command を多用すると、プレイブックの可読性が低下する可能性があります。
  • 冪等性
    Ansible の重要な原則です。win_file モジュールは state パラメータによって冪等性を保証しやすいですが、win_shellwin_command を使用する場合は、タスクが複数回実行されても意図しない副作用がないように、自身で冪等性を考慮したロジックを実装する必要があります。例えば、ファイルやディレクトリが存在するかどうかを事前に確認するなどの処理が必要です。