1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

環境

$ 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"
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?