LoginSignup
3
3

More than 5 years have passed since last update.

Ansible で AWS の keypair をリージョン間で共有する

Posted at

はじめに

  • Ansible 2.0.0.2
  • AWS 初級者(初心者ではないけど中級者でもない)
  • やっていいのかはわからないけど、人づてにそうしてると聞いた(アカウントで1つのマスターキーペアを全リージョンで使用)
  • ので AWS のキーペアを Ansible で作成して全リージョンで同じものを使う playbook を書いた(聞いた先では手作業だそうだけど)
  • 単に他リージョンへのキーペアのインポートなので正確には共有とは言わない(かもしれない。AWS で共有とはオブジェクトは1のはずなので)
  • 正確には全リージョンでテストしてない(たぶん出来ると思うけど)

先に説明

  • ansible の構成はオレオレベストプラクティス
  • ただ、Ansible で AWS の場合(鯖を作るんじゃなくてコレみたいに環境を整えるだけの場合)単一のplaybookで動くのでどうでもいいはず
  • キーペア名(keyname)が登録されていない場合に新規でキーペアを作成(すでにある場合はスキップ。べき等性)
  • その秘密鍵をローカルに保存(~/.ssh/keyname.pem)
  • その秘密鍵から公開鍵を作成(~/.ssh/keyname.pub)
  • その公開鍵を指定リージョンにインポート(import2region)
  • インポート先のリージョンには同名のキーがあった場合置換が発生し、常に所定のキーペアが使われる、らしい(フィンガープリントが更新されている)
  • ansible-playbook playbook/aws_keypair.yml
  • ssh -i ~/.ssh/test-key.pem ec2-user@IPADDR

ansible-playbook

playbook/aws_keypair.yml


- name: AWS key pair init
  hosts: localhost
  connection: local
  gather_facts: False
  vars:
    region: "us-east-1"
    keyname: "test-key"
    # aws ec2 describe-regions | jq '.Regions[].RegionName'
    import2region:
      #- "eu-west-1"
      #- "ap-southeast-1"
      #- "ap-southeast-2"
      #- "eu-central-1"
      #- "ap-northeast-2"
      - "ap-northeast-1"
      #- "us-east-1"
      #- "sa-east-1"
      #- "us-west-1"
      #- "us-west-2"

  tasks:

    - name: create key pair
      ec2_key:
        region: "{{ region }}"
        name: "{{ keyname }}"
      register: ec2_key_out

    - name: write to file
      local_action: shell echo -e "{{ item.value.private_key }}" > ~/.ssh/"{{ keyname }}".pem && chmod 600 ~/.ssh/"{{ keyname }}".pem
      with_dict: ec2_key_out
      when: item.value.private_key is defined

    - name: make publickey
      local_action: shell ssh-keygen -y -f ~/.ssh/"{{ keyname }}".pem > ~/.ssh/"{{ keyname }}".pub ; chmod 644 ~/.ssh/"{{ keyname }}".pub
      with_dict: ec2_key_out
      when: item.value.private_key is defined

    - name: maybe you want key pair for other region?
      ec2_key:
        name: "{{ keyname }}"
        key_material: "{{ lookup('file', '~/.ssh/' + keyname + '.pub') }}"
        region: "{{ item }}"
      with_items: import2region

雑感

  • cloudformation に挫折して
  • terraform で運用維持がきつそうなのでやめて
  • Ansible で可能なところだけ投げるだけでアカウント別初期処理にできればいいかなという最中
  • 仕事的に新しいアカウントでの環境構築が降って来るのでw
  • 仕事用には vars や role も分けて書いてるけど、AWS 環境初期構築にはこんな感じで1処理1ファイルのほうが断然使いやすい気がする
  • 北米リージョンで作って東京リージョンでも大丈夫だったので他も大丈夫だろう、的なw
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3