ansible.cnfでssh_configを設定する

ANSIBLE

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

2015年はAnsible盛り上がってますね。 大規模な構成管理ツールとしては疑問の声も聞こえてきたりしますが、弊社のAWS環境構築支援のように、ある程度お決まりの設定をサクっと8分組みしたいようなケースでは本当に便利です。

そんなAnsibleが手軽に使える最大の理由は、Ansibleがエージェントレスで、対象サーバにSSH接続が可能ならば利用できるという点であることは言うまでもありません。 この辺りもAWSの環境構築とAnsibleの親和性が高い理由のひとつです。 今回のエントリーでは、そんなAWSの環境構築を行う時に、ssh_confとAnsibleを組み合わせる方法を紹介します。

SSH接続と秘密鍵

Ansibleを実行するマシンから対象のサーバにはSSH接続を行う必要があります。 すなわち、秘密鍵が必要です(鍵認証無しでSSH可能な環境は論外で...)。 秘密鍵は、sshコマンドを利用する場合はiオプションで、ansible(ansible-playbook)コマンドを実行する場合はprivate-keyオプションで指定します。

# ssh -i ~/.ssh/key.pem ec2-user@xxx.xxx.xxx.xxx
# ansible-playbook --private-key=~/.ssh/key.pem -i hosts site.yml

このように秘密鍵の指定は面倒ですが、sshコマンドの場合は、~/.ssh/configにホストの設定を追記することで、簡略化できます。 また、IPアドレスではなく論理ホスト名を利用できるようになることも大切ですね。

  Host xxx.web1a
  User ec2-user
  HostName xxx.xxx.xxx.xxx
  IdentityFile ~/.ssh/key.pem
# ssh xxx.web1a

しかし、AWSなどを利用していて管理する環境が多くなってくると、~/.ssh/configが肥大化しがちです。

ssh_configの準備

sshの設定ファイルは、デフォルトで~/.ssh/configが利用されますが、コマンドにFオプションで指定することもできます。 このため、プロジェクト(環境)毎にssh_configファイルを作成する方針とします。 Ansibleのプロジェクトディレクトリにssh_configを作成してください。

Host xxx.web1a
  User ec2-user
  HostName xxx.xxx.xxx.xxx
  IdentityFile ~/.ssh/key.pem
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null

このファイルをFオプションでsshコマンドに指定します。

# ssh -F ssh_config xxx.web1a

このssh_configは、勿論SSH接続をするときに便利に利用できますが、Ansibleを利用するのにも有効です。

なお、EC2(AWS)の場合、ホスト名やIPアドレスは変わらなくとも、サーバの実体(インスタンス)が変更されるケースは多々あるので注意してください(このため、StrictHostKeyCheckingやUserKnownHostsFileの設定を行っています)。

ansible.cnfでssh_configを指定する

ansible.cnfはAnsible実行時の設定を保持するiniファイルです。 ansible.cnfのssh_connectionセクションのssh_argsには、Ansibleがssh接続を行う時のオプションを指定できます。 ここにFオプションを記述してください。

[ssh_connection]
ssh_args = -F ssh_config

これでAnsibleを実行する時に、実行ディレクトリのssh_configが有効になります。 すなわち、秘密鍵の指定や接続ユーザの設定が不要になり、ホスト名も論理ホスト名で解決できるようになります。

inventoryファイル

ssh_configが有効になっていることを前提とするならば、対象サーバを記述するinventoryファイルは、論理ホスト名で設定できます。

[web]
xxx.web1a
xxx.web2a
xxx.web1c
xxx.web2c

[batch]
xxx.batch

Ansible Playbookの実行 Ansibleを実行する時は、private-keyオプションは指定する必要がありません。

# ansible-playbook -i hosts site.yml

また、Ansibleのリモートユーザもssh_configで解決されるため、playbookファイルのremote_userの指定も不要です。

- hosts: all
  sudo: True
#  remote_user: ec2-user
  roles:
    - system/lang
    - system/timezone

多段SSHの解決

Ansibleで構成管理するサーバへのアクセスで踏み台サーバ必要とする場合も、ssh_configに設定を記述しておけばAnsibleで解決できます。 多段SSHの設定については、多段SSHをAnsibleで設定するを参照ください。

まとめ

プロジェクト毎にssh_configを作成し、論理ホスト名でSSHの接続設定を解決できるようにしてください。 Ansibleの実行時には、ansible.cfgでssh_connectionのssh_argsを指定し、ssh_configを有効にしましょう。 勿論、ssh_configはサーバに接続して確認をするときにも利用できます。

AWS Cloud Roadshow 2017 福岡