Ansible copyでディレクトリを指定したときに階層が1つ深くなることを防ぐ


環境

$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ ansible --version
ansible 2.9.7

やりたいこと

files/
    hoge/
        aaa
        bbb
        ccc
    tasks/
        main.yml

上記構成でhogeディレクトリとその中身を構築対象サーバ(ノード)に/tmp/hogeとして配置したい。

失敗例1

main.yml
- name: copy hoge
  copy:
    src:  "hoge"
    dest: "/tmp/hoge"

これを実行すると以下のようになる。

$ cd /
$ find /tmp/hoge
/tmp/hoge
/tmp/hoge/hoge
/tmp/hoge/hoge/ccc
/tmp/hoge/hoge/bbb
/tmp/hoge/hoge/aaa

んん~~1階層多いぞう!

失敗例2(失敗ではない)

main.yml
- name: copy hoge
  copy:
    src:  "hoge"
    dest: "/tmp"

結果

$ find /tmp/hoge
/tmp/hoge
/tmp/hoge/ccc
/tmp/hoge/bbb
/tmp/hoge/aaa

期待したどおりなんだけど、例えば転送したファイルaaaをこの先の処理で使いたい場合に/tmp/hogegroup_vars/all.ymlなどに定義しておいて変数として扱いたくなる。この例では

all.yml
# 転送先ディレクトリ
hoge_base_dir: "/tmp"
# ディレクトリ
hoge_dir: "/tmp/hoge"

と変数を2つ定義しなくちゃいけない?(Linuxのdirnameコマンドみたいなものが使えるのだろうか)。

成功例

main.yml
- name: copy hoge
  copy:
    src:  "hoge/"
    dest: "/tmp/hoge"

srcの最後に「/」をつけることで「指定したディレクトリ配下のファイル」という指示になる。よってこの指定は厳密には「files/hoge/ディレクトリ配下のファイル(aaa,bbb,ccc)をリモートの/tmp/hogeディレクトリ配下にコピーする」となる。

結果

$ find /tmp/hoge
/tmp/hoge
/tmp/hoge/aaa
/tmp/hoge/ccc
/tmp/hoge/bbb

これなら変数も以下で済む。

all.yml
# 転送先ディレクトリ
hoge_dir: "/tmp/hoge"