问题
I know how to create an AWS instance using Ansible. Now what I want to achieve is to configure that instance as web server by installing nginx using the same playbook which created the instance.
The goal of the playbook will be:
- Create an AWS instance.
- Configure the instance as Web server by setting up the Nginx server.
Is it possible with ansible?
回答1:
Read http://www.ansible.com/blog/ansible-ec2-tags It details how to spin up an ec2 instance (or multiple) and then run tasks against it (I.e install nginx).
I'f you want to jump straight to the example playbook https://github.com/chrismeyersfsu/playbook-ec2_properties/blob/master/new_group.yml
- Bring up ec2 instance
- Wait for ssh
- add ec2 instance to Ansible dynamically created host group w/ associated ec2 pem file (so you can ssh to it)
- Call an example play with a ping task to show everything works
Note: you would replace the ping task with your set of tasks to install nginx
@Bidyut How to reference ec2 ip address
look at Line 27 Note the use of register: ec2
Then at Line 46 the ec2 ip address is "extracted" {{ ec2.results[item.0]['instances'][0]['public_ip'] }}
. Note that the example calls register
within a loop. If you are just creating one ec2 instance then the ec2 ip address reference would look like {{ ec2.results['instances'][0]['public_ip'] }}
回答2:
Here is a working example that might help you.
---
- hosts: localhost
connection: local
gather_facts: no
tasks:
- name: Create the EC2 Instance
ec2:
region: us-east-1
group: sg-xxxxx # Replace your Security Group here
keypair: test-key # Replace Key here
instance_type: t2.mirco
image: ami-xxxxx # Replace AMI here
vpc_subnet_id: subnet-xxxxx # Replace Subnet here
assign_public_ip: yes
wait: yes
wait_timeout: 600
instance_tags:
Name: "My-EC2-Instance"
register: ec2
- name: Create SSH Group to login dynamically to EC2 Instance
add_host:
hostname: "{{ item.public_ip }}"
groupname: ec2_server
with_items: ec2.instances
- name: Wait for SSH to come up
wait_for:
host: "{{ item.public_ip }}"
port: 22
state: started
with_items: ec2.instances
- hosts: ec2_server
become: yes
# Use ec2_user if you are using CentOS/Amazon server
remote_user: ubuntu # for Ubuntu server
gather_facts: yes
roles:
- webserver
回答3:
Yes, you can use a single playbook to launch an instance and install nginx. Use the ansible module add_host to add the ip of the just launched instance. Then write a play for the new host.
- Launch an EC2 instance using ec2 module and register the instance
- Use add_host module to add the new instance to the host inventory
- Write a new play with host as the just registered host and call apt to install nginx
Try it and if you need code snippet, let me know.
来源:https://stackoverflow.com/questions/34394672/getting-the-ip-address-attributes-of-the-aws-instance-created-using-ansible