この投稿は Ansible Advent Calendar 2013 の5日目の記事です。 前日はこちら こんにちは、Ansible Tutorial をそろそろリニューアルしないといけないなと思いつつ、更新すら全然できていない yteraoka です。あの Playbook は 1.2 時代に書いて 1.3 でも 1.4 でもテストしてないので動かないかもしれない… WordPress だってバージョンの指定がもう古いし。 このブログの前回のポスト「ansible の copy/template で例外対応」で次は fileglob を試してみると書いたので、今日はそれをやってみます。 が、その前に… 前回、with_first_found を試して copy モジュールは期待通りに動作したのに template はちょっと期待と違う動作となりました。なんでかなぁ?とコードをチラ見してたところこんな発見がありました。
with_first_found と似て非なる first_available_file というものがあったのか #ansible
— yteraoka (@yteraoka) November 27, 2013
with_first_found と似て非なる first_available_file というものがあったのか #ansible
— yteraoka (@yteraoka) 2013, 11月 27
first_available_file を使うと、期待通りに role の templates ディレクトリの中を順番に探してくれました。 ヤッタネ! では今日の本題 fileglob を使ったファイルのコピーです。『えっ!そんなの copy モジュールでディレクトリ毎コピーすればいいじゃん!』っていう Ansible マスターなお方はちょいとお待ちを。 copy モジュールの再帰コピーは 1.4 からの新機能 Ansible 1.4 Released! なんです。私、まだ 1.3 ユーザーなのです。 EPEL さんなかなか 1.4 にならないので只今 Python コンパイル中でござる。 では順番に。 テキトーにファイルを準備
$ ls roles/test/files/conf.d
aaa bbb ccc ddd.conf eee.conf
files ディレクトリの conf.d/*.conf を対象にしてみる。 debug モジュール便利ですね。
$ cat roles/test/tasks/fileglob.yml
---
- debug: msg={{ item }}
with_fileglob: conf.d/*.conf
tags: test
実行
$ ansible-playbook -i hosts site.yml -l ansibletest1 -t test -v
PLAY [ansibletest1] ***********************************************************
GATHERING FACTS ***************************************************************
ok: [ansibletest1]
TASK: [debug msg=] ************************************************************
ok: [ansibletest1] => (item=/home/ytera/ansible/roles/test/files/conf.d/ddd.conf) => {"item": "/home/ytera/ansible/roles/test/files/conf.d/ddd.conf", "msg": "/home/ytera/ansible/roles/test/files/conf.d/ddd.conf"}
ok: [ansibletest1] => (item=/home/ytera/ansible/roles/test/files/conf.d/eee.conf) => {"item": "/home/ytera/ansible/roles/test/files/conf.d/eee.conf", "msg": "/home/ytera/ansible/roles/test/files/conf.d/eee.conf"}
PLAY RECAP ********************************************************************
ansibletest1 : ok=2 changed=0 unreachable=0 failed=0
期待通りに動作しそうです。
conf.d/* とかまるっとコピーしたいなんて用途ありますよね。
rsync とか tar で展開とかだと変更がないのに changed になって、不要な notify が実行されたりするかもしれませんからね。
さて、1.4 からの再帰コピーですが、rsync ライクな実装になっていて、 src のディレクトリ指定で最後に ‘/’ をつけておくと、そのディレクトリの中身だけをコピーし、 ‘/’ を付けなかった場合はそのディレクトリごとコピーされるんです。どんどん便利になって素敵ですね。私もちょっぴり貢献をば https://github.com/ansible/ansible/pull/4027 それでは明日は takuan_osho さんの記事をお楽しみに〜。