【備忘録】Ansible応用編① EC2インスタンス作成からsshキーでの自動化

【備忘録】Ansible応用編① EC2インスタンス作成からsshキーでの自動化:


環境

【備忘録】Ansible② Playbookとインベトリの書き方 で使用したEC2

・T2.micro(webサーバー)

・Python2.7.14(boto、awscliインストール済み)

・aws-cli設定済み


インベントリ設定

Ansible.cfgに以下の設定を追加する。

StrictHostKeyChecking=no を指定することで初めて接続するホストに対しての接続許可(Yes/No)の確認を無効にできる。

private_key_file に設定した認証鍵を使用して、リモートホストに接続する。(今回作成するEC2の認証鍵)

[ssh_connection] 
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no 
private_key_file = /home/ec2-user/.ssh/dev-key.pem 


Playbook作成

以下のPlaybookは /etc/ansible/hosts にホストを書き込むため、実行ユーザーに書き込み権限が必要。

# ~/create-ec2.yml 
- name: EC2インスタンス作成 
  hosts: localhost 
  connection: local 
  gather_facts: False 
  vars: 
    keypair_name: dev-key   # 作成する認証鍵の名前 
    ec2_name: test-ec2      # 作成するEC2の名前 
    profile: default 
    region: ap-northeast-1 
  tasks: 
 
  - name: AWSに認証鍵を登録 
    ec2_key: 
      name: "{{ keypair_name }}" 
      region: "{{ region }}"       # リージョンの指定 
      profile: "{{ profile  }}"    # プロフィールの指定 
    register: keypair_regst 
 
  - name: 認証鍵ファイル生成(権限:0600) 
    file: 
      path=~/.ssh/{{ keypair_regst.key.name }}.pem 
      state=touch 
      mode=0600 
 
  - name: 認証鍵ファイルにデータを追加 
    shell: echo "{{ keypair_regst.key.private_key }}" > ~/.ssh/{{ keypair_name }}.pem 
    when: keypair_regst.key.private_key is defined 
 
  - name: EC2インスタンスの生成 
    ec2: 
      instance_tags: 
        Name: "{{ ec2_name }}"        # インスタンスの名前を指定 
      key_name: "{{ keypair_name }}"  # インスタンスにログインするための認証鍵を指定 
      instance_type: t2.micro         # インスタンスタイプを指定 
      image: ami-0a2de1c3b415889d2    # Amazon Linux2 を指定  
      region: ap-northeast-1          # 東京リージョンを指定 
      vpc_subnet_id: subnet-xxxxxxx   # サブネットを指定(ここは適宜変える) 
      group: your-group-name          # セキュリティグループ名を指定(ここは適宜変える) 
      wait: yes 
      count: 1                        # インスタンスは1つ 
      assign_public_ip: no 
    register: ec2_regst 
 
  - name: インベントリにホストを追加 
    add_host: 
      groups=my_host 
      name="{{ ec2_regst.instances[0].private_ip }}" 
 
  - name: 作成したEC2が接続可能状態になるまで待つ 
    local_action: wait_for port=22 host="{{ ec2_regst.instances[0].private_ip }}" search_regex=OpenSSH delay=5 
 
- name: EC2インスタンスにsshログイン 
  hosts: my_host  # 作成時にインベトリに追加したグループを指定 
  serial: 1 
  user: ec2-user  # EC2 デフォルトユーザーを指定 
  tasks: 
    - debug: 
      msg: "Hello world!" 


実行結果

実行すると認証鍵の登録と、EC2の作成、ログイン、デバックログの表示まで実行される。

$ ansible-playbook create-ec2.yml 
PLAY [EC2インスタンス作成] *************************************************************************************************************************************************************************************************************************** 
 
TASK [AWSに認証鍵を登録] **************************************************************************************************************************************************************************************************************************** 
changed: [127.0.0.1] 
 
TASK [認証鍵ファイル生成(権限:0600)] ******************************************************************************************************************************************************************************************************************** 
changed: [127.0.0.1] 
 
TASK [認証鍵ファイルにデータを追加] ************************************************************************************************************************************************************************************************************************ 
changed: [127.0.0.1] 
 
TASK [EC2インスタンスの生成] ************************************************************************************************************************************************************************************************************************** 
changed: [127.0.0.1] 
 
TASK [インベントリにホストを追加] ************************************************************************************************************************************************************************************************************************* 
changed: [127.0.0.1] 
 
TASK [作成したEC2が接続可能状態になるまで待つ] ***************************************************************************************************************************************************************************************************************** 
ok: [127.0.0.1 -> localhost] 
 
PLAY [EC2インスタンスにsshログイン] ********************************************************************************************************************************************************************************************************************* 
 
TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** 
ok: [xxx.xx.xx.xxx] 
 
TASK [debug] ********************************************************************************************************************************************************************************************************************************* 
ok: [xxx.xx.xx.xxx] => { 
    "msg": "Hello world!" 
} 
 
PLAY RECAP *********************************************************************************************************************************************************************************************************************************** 
127.0.0.1                  : ok=6    changed=5    unreachable=0    failed=0    
xxx.xx.xx.xxx              : ok=2    changed=0    unreachable=0    failed=0   
 


Permission denied 等のエラーが発生した場合

以下のディレクトリ、ファイルの権限を確認する。

ディレクトリ or ファイル名 権限
/home/<ユーザー名> 755
/home/<ユーザー名>/.ssh 700
/home/<ユーザー名>/.ssh/authorized_keys 644
/home/<ユーザー名>/.ssh/known_hosts 644




コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)