ansible.cfgのスニペットと補足

公式のAnsible Configuration Settingsが全てです。 ターミナルからは list サブコマンドでドキュメントを読むことができます。

1
$ ansible-config list

ですが190もあり詳細も書かれていません。 なので自分でよく設定しているものをスニペットとして残し少し補足しておきます。また設定値の確認方法なども説明します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[defaults]
inventory = ./inventories/vagrant/dev/
roles_path=~/.ansible/roles:./roles
vault_password_file=./proj.vault-pass

remote_user = provisioner
private_key_file=./id_rsa.provisioner
host_key_checking = False

[ssh_connection]
pipelining = true
# ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

設定値の確認方法

ansible-config というコマンドが便利です。 また dump コマンドを使うこと現在の設定と、それがどのファイルで設定されているか確認することができます。

1
$ ansible-config dump

書くなら覚えておきましょう。それだけです。

補足

設定項目について説明していきます。設定ファイルに書くセクション名・キーではなく設定値について書いていきます。 そのためまえのスニペットとの対応がすぐにわかる形ではないです。 各設定値のリンク先で設定ファイルで利用するときのセクション名・キーが書かれているので、そこで対応付けできます。

DEFAULT_HOST_LISTはインベントリを指定します。ここでは開発環境に向けています。

DEFAULT_ROLE_PATHでロールのディレクトリを設定しています。 ansible-galaxy で外部からインストールしたロールは1つめのディレクトリに配置されます。わたしはホームディレクトリ配下に .ansible/role を作ってサードパーティのロールはここに格納しています。 またリポジトリ内で定義したロールは読み込める必要があります。 : 区切りの2つめに直下を設定しています。

以降はSSH接続でつかう設定です。

DEFAULT_REMOTE_USERがログインユーザー名です。

DEFAULT_PRIVATE_KEY_FILEがsshなどで使う秘密鍵の場所です。[ssh_connection] セクションで設定しないので注意が必要です。

ANSIBLE_PIPELININGを有効にすることで通信の最適化が行われます。デフォルトではタスクごとに一時ファイルを作り別の接続でスクリプトを実行します。この一時ファイルを作ることをせず2回の通信を1回に減らすことができます。デフォルトで無効なのは一部の環境でサポートされていないためです。

ANSIBLE_SSH_ARGSを使うことでSSHにフラグを渡すことができます。 ここで -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null というフラグを渡していました。これによりサーバーキーの検証を無効にしています。

次の HOST_KEY_CHECKING と同一の目的なのでこちらはコメントアウトで削っています。消してもいいのですがいじりやすいようにコメントとして残しています。

HOST_KEY_CHECKINGFalse にしています。これにより新規ホストに接続するときにホストキーを検証しません。

これを設定しないとCircleCIなど非対話的な環境から新規ホストに接続するときに接続できずに失敗します。

おわりに

本来であればホストキー検証はするべきです。 なのでインベントリでホストキー検証に必要な情報を提供し HOST_KEY_CHECKING を有効にしておくべきです。

したの2つの公式資料を眺めた感じAnsibleで直接やる方法はなさそうでした。

/etc/ssh/ssh_host_rsa_key の自動更新やDNSとDNSSECとSSHの VerifyHostKeyDNS フラグを組み合わせるなど検証できる環境を作るのが正しい解決方法になるのだと思います。

comments powered by Disqus