AnsibleでEC2の秘密鍵を作成する

2016.07.04

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

渡辺です。 今日はAnsibleのec2_keyモジュールを使ってキーペアを作成する方法を紹介します。

ec2_keyモジュール

Ansibleのec2_keyモジュールは、コアモジュールのひとつで、AWS上のキーペアを管理します。 キーペアの作成・削除だけではなく、ローカルの秘密鍵のインポートも可能です。

共通となっているパラメータはregionprofileです。 それぞれ変数(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

ポイントとなるのは、registerec2_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モジュールで秘密鍵を削除する場合は、stateabsentを指定します。

- 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で統一するのもひとつの戦略かと思います。