この投稿は 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) 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 さんの記事をお楽しみに〜。
Comments