Ansible初心者のつまづきポイント

2014.12.12

この記事は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ディレクトリは存在しないものとします。実行すると以下のようになります。

ansible_1

この時には/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の末尾にスラッシュを足しました。この状態で実行してみましょう。

ansible_2

!?なんと実行できてしまいました。/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/というディレクトリにしています。実行結果を見てみましょう。

ansible_4

なんと成功してしまいました。。ややこしい。手元で試した結論としては、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

これからAnsibleを学ぶ方へ

Ansibleは公式ドキュメントがかなり充実しているのでだいたいの答えは書いてあります。まずはこれを読みましょう。 Ansibleのコーディング規約に関しては以下のサイトが参考になりました。AnsibleはChefと比較するとユルい、というか縛りが少ないのでこういった規約をプロジェクト毎に決めておくと良いと思います。

また、入門Ansibleという本をKindleで読むことができます。値段も手頃で分かりやすく解説されているので、こちらもお勧めです。

今年はAnsibleに大変お世話になりました。来年もお世話になる予定です。よろしくお願いいたします。