AnsibleでEC2の秘密鍵を作成する
渡辺です。 今日はAnsibleのec2_keyモジュールを使ってキーペアを作成する方法を紹介します。
ec2_keyモジュール
Ansibleのec2_keyモジュールは、コアモジュールのひとつで、AWS上のキーペアを管理します。 キーペアの作成・削除だけではなく、ローカルの秘密鍵のインポートも可能です。
共通となっているパラメータはregion
とprofile
です。
それぞれ変数(vars
)で定義していますが、これは直書きでも構いません。
profile
の代わりにaws_access_key
/ aws_secret_key
を使うこともできます。
また、ec2_keyモジュールが実行されるマシンはローカルマシンです。 ローカルマシンからAWSCLIを実行しているイメージで実行されますので、Ansibleにおけるリソースの冪等性とは切り離して考えた方が良いでしょう。
ec2_keyモジュールで秘密鍵を作成する
ec2_keyモジュールで秘密鍵を作成する時のポイントは、作成されたキーペアの秘密鍵をローカルに保存する仕組みです。 ec2_keyモジュールの出力に含まれている秘密鍵をファイルに出力します。
次のplaybookは、devという名前のキーペアを作成し、pemファイルを作成します。
- hosts: localhost connection: local gather_facts: False vars: profile: default region: ap-northeast-1 tasks: - name: key for development ec2_key: name: dev region: "{{ region }}" profile: "{{ profile }}" register: dev_key - name: output key shell: echo "{{ dev_key.key.private_key }}" > {{ dev_key.key.name }}.pem when: dev_key.key.private_key is defined
ポイントとなるのは、register
でec2_keyモジュールの出力を変数に登録している点と、shellモジュールの引数に秘密鍵を渡している点です(Windows環境ではshell部分を適当に書き換えてください)。
既にキーペアが存在する場合は、dev_keyに値が登録されないため、whenで条件付けをしています。
このplaybookを実行すると、実行したディレクトリに dev.pem
という名前で秘密鍵が作成されます。
ec2_keyモジュールで公開鍵をインポートする
ec2_keyモジュールで公開鍵をインポートする場合は、key_material
で公開鍵を指定します。
変数などでplaybookに埋め込んでも良いですが、リポジトリで管理するならばvalutで暗号化したりと面倒です。
ローカルファイルから読み込むwith_file
を利用するのが良いと思います。
- hosts: localhost connection: local gather_facts: False vars: profile: default region: ap-northeast-1 tasks: - name: key for development ec2_key: name: dev region: "{{ region }}" profile: "{{ profile }}" key_material: "{{ item }}" with_file: ~/.ssh/id_rsa.pub
鍵の作成と管理はローカルマシンでやる場合は、こちらの方法がオススメです。
ec2_keyモジュールで秘密鍵を削除する
ec2_keyモジュールで秘密鍵を削除する場合は、state
にabsent
を指定します。
- hosts: localhost connection: local gather_facts: False vars: profile: default region: ap-northeast-1 tasks: - name: key for development ec2_key: name: dev region: "{{ region }}" profile: "{{ profile }}" state: absent
ただし、Ansibleで操作を行うのはあまり行儀の良いやり方ではありません。 削除したい場合はAWSCLIを利用したり、マネジメントコンソールかた実行する方がベターです。
まとめ
キーペアはCloudFormationで作成できません。 また、EC2インスタンスに秘密鍵をアップロードしたい場合も多いでしょう。 AWSでのキーペアの管理はAnisibleで統一するのもひとつの戦略かと思います。