ksaitoの日記

日々試したことの覚え書き

ansibleでwinrmセットアップ済みのec2インスタンスを作成する。

移転しました。

自動的にリダイレクトします。

ansibleでwinrmセットアップ済みのec2インスタンスを作成しました。

ansibleのec2モジュールを使ってWindows 2012R2のAMIを作成します。

インスタンス作成時に実行されるスクリプトをuser_dataに設定しておくことでwinrmが利用可能なec2インスタンスが作成されます。

playbookは以下の通りで、user_dataは、こちらを使わせて頂きました。

---
- name: Create an Windows instance with winrm on Amazon EC2
  hosts: localhost
  vars:
    ec2_ami_id: ami-e0e00f8d
    ec2_region: us-east-1
    ec2_instance_type: t2.micro
    ec2_key_name: mykey
    ec2_subnet_id: subnet-3beddb4d
  tasks:
    - name: Create a new keypair
      ec2_key: name="{{ec2_key_name}}" region="{{ec2_region}}"
      register: keypair
    - name: Write the key to a file
      copy:
        dest: files/mykey.pem
        content: "{{keypair.key.private_key}}"
        mode: 0600
      when: keypair.changed

    - name: start windows instance
      ec2:
        image: "{{ec2_ami_id}}"
        region: "{{ec2_region}}"
        instance_type: "{{ec2_instance_type}}"
        key_name: "{{ec2_key_name}}"
        group: [rdswinrm]
        exact_count: 1
        count_tag: { Name: winrm }
        vpc_subnet_id: "{{ec2_subnet_id}}"
        assign_public_ip: yes
        instance_tags:
          Name: ansible
          env: develop
        wait: true
        user_data: "<powershell>
  Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force\n
  $storageDir = $pwd\n
  $webclient = New-Object System.Net.WebClient\n
  $url = \"https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1\"\n
  $file = \"C:\\Program Files\\Amazon\\Ec2ConfigService\\Scripts\\ConfigureRemotingForAnsible.ps1\"\n
  $webclient.DownloadFile($url,$file)\n
  $VerbosePreference=\"Continue\"\n
  & $file\n
</powershell>"

botoインストールやAWSの接続情報の設定は、省略します。 これで、しばらくするとインスタンス作成が完了します。

$ ansible-playbook ec2-winrm.yml

PLAY [Create an Windows instance with winrm on Amazon EC2] *********************

TASK [Create a new keypair] ****************************************************
ok: [localhost]

TASK [Write the key to a file] *************************************************
skipping: [localhost]

TASK [start windows instance] **************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0   

$ 

インベントリは、以下の通りです。 awsコンソールで確認した情報を追加すれば複数台のサーバを一括管理できます。

$ cat inventory/hosts-win 
[windows]
winrm1  ansible_ssh_host=<IP or サーバ名> ansible_password=<パスワード>
winrm2  ansible_ssh_host=<IP or サーバ名> ansible_password=<パスワード>

[windows:vars]
ansible_user=Administrator
ansible_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

接続を確認します。

$ ansible -i inventory/hosts-win windows -m win_ping

winrm2 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
winrm1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
$