Ansible初心者のつまづきポイント
この記事はAnsible Advent Calendar 2014 - Qiitaの12日目の記事になります。
Ansibleを今年の夏頃から使い始めました。今ではそれなりの規模の構築にもAnsibleを利用するようにしています。
昨年末頃からChef(chef-solo)を使い始め、Chefに慣れてきた頃にAnsibleも触りだした形になります。今日はAnsibleを始めてから今日に至るまでにハマったポイントをいくつか挙げておきます。
なお、以下の検証は全てVagrant上のCentOS6.5で実施しています。
copyモジュールでdestにディレクトリを指定する際の注意点。
例えば以下のようなTaskを実行します。
... tasks: - name: copy sample copy: src=foo/bar.txt dest=/tmp/baz/qux
上記実行時、/tmp/bazディレクトリは存在しないものとします。実行すると以下のようになります。
この時には/tmp/bazが無いというエラーになりますね。次に以下のようにPlaybookを変更します。
[vagrant@host ~]$ diff -u tasks.yml.org tasks.yml --- tasks.yml.org 2014-12-11 07:25:07.857361826 +0000 +++ tasks.yml 2014-12-11 07:25:12.810837152 +0000 @@ -2,4 +2,4 @@ sudo: no tasks: - name: copy sample - copy: src=foo/bar.txt dest=/tmp/baz/qux + copy: src=foo/bar.txt dest=/tmp/baz/qux/
destの末尾にスラッシュを足しました。この状態で実行してみましょう。
!?なんと実行できてしまいました。/tmp/baz/qux/bar.txtが作成されています。このようにdestの末尾にスラッシュを記載するとそのディレクトリを再帰的に作成する挙動になっているようです。
次は以下のようなPlaybookを試します。
[vagrant@host ~]$ diff -u tasks.yml.org tasks.yml --- tasks.yml.org 2014-12-11 07:25:07.857361826 +0000 +++ tasks.yml 2014-12-11 07:25:12.810837152 +0000 @@ -2,4 +2,4 @@ sudo: no tasks: - name: copy sample - copy: src=foo/bar.txt dest=/tmp/baz/qux + copy: src=foo/ dest=/tmp/baz/qux
先ほどエラーになったdestに末尾スラッシュをつけないパターンです。今回はsrcをfoo/というディレクトリにしています。実行結果を見てみましょう。
なんと成功してしまいました。。ややこしい。手元で試した結論としては、copyモジュールのsrcがファイル、destに存在しないディレクトリ上のファイルを指定すると失敗するということです。ドキュメントにこの辺りの挙動についての記述を見つけることができませんでした。どなたかご存知でしたらコメントなりで教えていただけると助かります。
EC2に対してSSHでログインできない
これは以前ブログに書いたのでそちらを参照ください。
commandモジュールでのリダイレクト
リモートホストでコマンドを実行する際に、リダイレクトやパイプなどを使った処理を実行したいことは多いと思います。下の例はその簡単な例です。
- hosts: all tasks: - name: echo command: echo 1 > /tmp/foo
上記を実行すると/tmp/fooが作成されると思ったのですが、実際したところファイルが作成されませんでした。ドキュメントを読んだところ、リダイレクトやパイプラインを利用する場合はcommandモジュールではなくshellモジュールを利用する必要があるようです。
- hosts: all tasks: - name: echo shell: echo 1 > /tmp/foo
- shell - Execute commands in nodes. — Ansible Documentation
- command - Executes a command on a remote node — Ansible Documentation
これからAnsibleを学ぶ方へ
Ansibleは公式ドキュメントがかなり充実しているのでだいたいの答えは書いてあります。まずはこれを読みましょう。 Ansibleのコーディング規約に関しては以下のサイトが参考になりました。AnsibleはChefと比較するとユルい、というか縛りが少ないのでこういった規約をプロジェクト毎に決めておくと良いと思います。
また、入門Ansibleという本をKindleで読むことができます。値段も手頃で分かりやすく解説されているので、こちらもお勧めです。
今年はAnsibleに大変お世話になりました。来年もお世話になる予定です。よろしくお願いいたします。