この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
渡辺です。 今日は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で統一するのもひとつの戦略かと思います。