Ansible unarchiveでルートディレクトリにowner,groupが効かない


何があったさ

play-bookに以下のようにowner,groupを指定しているのに、ルートディレクトリだけはコレが効かないので色々試した。

playbook.yml
- name: test unarchive
  unarchive:
    src:   "hoge.tar"
    dest:  "/tmp/."
    owner: "udon"
    group: "udon"
結果
$ find /tmp/hoge -ls
792842    4 drwxr-xr-x   2 root     root         4096  6月 16 14:44 hoge    ★コイツがroot:rootになる
792926    0 -rw-r--r--   1 udon     udon            0  6月 16 14:44 hoge/b
792927    0 -rw-r--r--   1 udon     udon            0  6月 16 14:44 hoge/c
792855    0 -rw-r--r--   1 udon     udon            0  6月 16 14:44 hoge/a

環境

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

$ ansible --version
ansible 2.9.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ansi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

原因

転送するhoge.tarの作り方に問題があった。
unarchiveに指定するowner,groupは、アーカイブに含まれるファイル・ディレクトリについてのみ有効となる。

間違ったアーカイブ作り方
$ tar cfp hoge.tar hoge/*
正しいアーカイブ作り方
$ tar cfp hoge.tar hoge

上記のように「hoge」ディレクトリもアーカイブに含めてやればいい。

「正しい」と書いてしまったが、それは時と場合によりけり。