homebrew
Ansible
sshpass

ansible-playbookコマンドをInventoryファイルなしで実行する

More than 3 years have passed since last update.


まえがき

Chef-soloをそれなりな感じで便利に使っていたのですが、いろいろあって最近Ansibleに乗り換えました。

プロビジョニング対象のサーバーにSSHとPythonさえ入っていればいいというのがすごく楽ですし、YAMLで書くPlaybookファイルも手に馴染む感じがあってお気に入りです。

Vagrantをよく使うので、最近はVagrantのプロビジョニングもAnsibleでやるようしています。

Ansibleを使ってプロビジョニングを行うフローは、


  • Inventoryファイルを作ってプロビジョニング対象を決める

  • Playbookを書く


  • ansible-playbookコマンドを実行してプロビジョニング

というような感じになるかと思いますが、たまにInventoryファイルを書くのが面倒になるので、この記事ではansible-playbookコマンドをInventoryファイルなしで実行するための方法を紹介したいと思います。


ansible-playbookコマンドをInventoryファイルなしで実行する

VagrantのVMに対してInventoryファイルなしでansible-playbookを実行する例を2つほど紹介します。

公式ドキュメントには/etc/ansible/hostsにホストを書くというのが紹介されていますが、この記事では紹介しません。


方法1: --user, --private-keyオプションを使う

公開鍵認証ができる普通のサーバーであれば、この方法を使用しましょう。

ansible-playbook -i "localhost:2222," --user=vagrant --private-key=~/.vagrant.d/insecure_private_key playbook.yml

オプションを見てのとおり、--userでリモートのユーザー名、--private-keyで秘密鍵ファイルを指定します。

また、これは以降の方法でも同様なのですが、-iで指定する対象のホストやポート番号はlocalhost:2222,のように、末尾にカンマをつける必要があります。

複数のホストを指定したい場合はlocalhost:2222,localhost:2200,のように指定することもできます。

複数ホストを指定した場合、末尾のカンマは無くても良いようです。


方法2: --user, --ask-passオプションを使う(非推奨)

サーバーに公開鍵認証でログインできない。というのは今日ではあまり聞かなくなりましたが、そのようなサーバーがまだ存在することは事実です。

その場合、--ask-passオプションを使用することでパスワード認証でもansible-playbookコマンドを使うことができます。


sshpassコマンドのインストール

--ask-passオプションを使用するにはsshpassというコマンドが必要になります。

使用しているOSによって若干コマンドや方法は異なりますが、以下のような感じでインストールできます。


CentOSなどのRedhat系OS

EPELが使用できることが前提ですが、以下のコマンドでインストールできます。

yum install askpass


Debian, Ubuntu

apt-get install askpass


OSX(Homebrew)

Macの場合はHomebrewを使うのが良いでしょう。

しかし、他のパッケージと同様にbrew installでインストールしようとすると、以下のようなメッセージが表示されインストールができません。

% brew install sshpass

Error: No available formula for sshpass
We won't add sshpass because it makes it too easy for novice SSH users to ruin SSH's security.

sshpassコマンドを使用すると、historyにパスワードが平文で残ったりすることから、おそらくHomebrewで簡単にインストールできないように制限をかけているようですが、以下のコマンドでインストールできます。

brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb


参考


プロビジョニング

sshpassがインストールされている状態で、以下のコマンドを実行します。

パスワードを入力するプロンプトが表示されるので、ログインユーザーのパスワードを入力してください。

ansible-playbook -i "localhost:2222," --user=vagrant --ask-pass playbook.yml


まとめ

Inventoryファイルなしでansible-playbookコマンドを使う方法を2つ紹介してみました。

--user--private-keyansibleコマンドでも使用できるので、以下のようにAdHoc CommandをInventoryファイルなしで使用することも可能です。

ansible all -i "localhost:2222," --user=vagrant --private-key=~/.vagrant.d/insecure_private_key -m shell -a "uname -a"

Chefでも同様のことができるのかもしれませんが、AnsibleはAdHocコマンドのようにちょっとしたことでも使えるのもうれしいですね。

最後に改めて書きますが、sshpassを使う状況は健全ではないので、Ansible導入の前に公開鍵認証を導入しましょう。