てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] os.path.join のようにいい感じにパスを連結する path_join フィルター

はじめに

Ansible 2.10 で path_join というフィルターが追加されました。(対応PR

Pythonos.path.join のように、与えられた文字列のリストを、ディレクトリの階層、ファイル名として扱い、/ を必要に応じて補いながら連結してくれます。

通常の文字列連結でもできなくもないですが、ディレクトリ名の末尾に / があるかないかを気にせずに連結できる点が path_join フィルターの良いろころだと思います。

  • 動作確認環境
    • ansible-base 2.10.1

サンプル

---
- hosts: localhost
  gather_facts: false

  tasks:
    - name: debug path
      debug:
        msg: "{{ item | path_join }}"
      loop:
        - ["dir", "file.txt"]
        - ["dir/", "file.txt"]

実行ログ

$ ansible-playbook -i localhost, path_join.yml

PLAY [localhost] ***************************************************************************************************************************************

TASK [debug path] **************************************************************************************************************************************
ok: [localhost] => (item=['dir', 'file.txt']) => {
    "msg": "dir/file.txt"
}
ok: [localhost] => (item=['dir/', 'file.txt']) => {
    "msg": "dir/file.txt"
}

PLAY RECAP *********************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ディレクトリ名のあとに / があってもなくても、結果的には dir/file.txt のように仕上げてくれました。