AnsibleでEC2サーバーを立ててApacheを導入するところまで。
概要
AWS上にEC2サーバーを立て、そこにApacheをインストールするところまで。
事前準備
pythonにboto/boto3を入れる
AnsibleはPythonで動いており、pythonのAWSライブラリである。botoを利用してawsにアクセスするため
pip install boto boto3
AWS環境の事前準備
export AWS_ACCESS_KEY_ID='< マネジメントコンソールで取得したやつ >' export AWS_SECRET_ACCESS_KEY='< マネジメントコンソールで取得したやつ >'
- EC2用のkeypairを作成し、ダウンロードしておく
作成したインスタンスにそのままアクセスできるように。
/.ssh/keypair.pemとして配置しておく。
Ansibleで作成することもできるが今回の本題ではないので省略。
Ansibleの設定
homahi-2:ansible homahi$ tree . . ├── ansible.cfg ├── aws.retry ├── aws.yml ├── hosts ├── roles │ ├── apache │ │ └── tasks │ │ └── main.yml │ └── ec2 │ └── tasks │ └── main.yml ├── site.yml └── ssh_config
最終的にこんな感じにする。
Ansibleでやること
EC2を立てるまでと、Apacheを入れる部分は別のplaybookにした。
AWSの設定
hosts
[localhost] 127.0.0.1 [localhost:vars] # /usr/bin/pythonというデフォルトパスを通常はみてしまう ansible_python_interpreter=/Users/homahi/.pyenv/shims/python
ansible_python_interpreterはpyenvなどでデフォルトとpythonのパスが異なる時に必要になる。
これが無いと/usr/bin/pythonとかを見に行ってこける。
ちょっと詰まった。
aws.yml
- hosts: localhost connection: local gather_facts: no roles: - role: ec2
roles/ec2/tasks
- name: セキュリティグループを作成 ec2_group: name: Test Security Group description: server security group region: us-east-1 rules: - proto: tcp from_port: 22 to_port: 22 cidr_ip: """my_ip""" - proto: tcp from_port: 80 to_port: 80 cidr_ip: """my_ip""" rules_egress: - proto: all from_port: 0 to_port: 65535 cidr_ip: 0.0.0.0/0 - name: EC2を作成する ec2: image: ami-8c1be5f6 instance_type: t2.micro key_name: keypair group: Test Security Group wait: yes wait_timeout: 300 region: us-east-1 register: _ec2 - debug: var=_ec2 - name: SSHで接続できるようになるまで待機 wait_for: port=22 host="{{ item.public_ip }}" timeout=300 state=started with_items: "{{_ec2.instances}}"
ansible-playbook aws.yml -i hosts
これで22,80番portのみが自分のサイトに対して開いているEC2が立つ。 本当はdinamic inventoryで動的にIPを取得したいけど、今回は対象外。
Apacheを入れる
site.yml
- hosts: web become: yes remote_user: ec2-user roles: - role: apache
hosts(追記)
[web] webserver
ssh_config
Host webserver HostName <<EC2のipアドレス>> Port 22 User ec2-user IdentityFile ~/.ssh/keypair.pem
ansible.cfg
[ssh_connection] control_path = %(directory)s/%%h-%%r ssh_args = -o ControlMaster=auto -o ControlPersist=60s -F ssh_config
ansible-playbook site.yml -i hosts
正常に動けば、EC2にApacheが入っていることが確認できる。