One of the steps of creating and testing ansible roles is verifying that the role does what it was intended to do in real EC2 instances.
To automate this workflow I usually launch 5 instances (centOS 7, centOS 8, Ubuntu 18, and Ubuntu 20) using python and boto3.
LAUNCH EC2
Here is a snippet of my script, you can find the complete script here
The script adds the tags env: ansible and distro: AMI['distro'] to the instances. This comes handy for grouping the ansible dynamic inventories
instances = ec2.create_instances(
ImageId = AMIS[i]["ami"],
MinCount = 1,
MaxCount = 1,
InstanceType = 't3.micro',
KeyName = KEY,
SecurityGroupIds=[SG],
SubnetId=SUBNET,
TagSpecifications=[
{
'ResourceType': 'instance',
'Tags': [
{
'Key': 'Name',
'Value': AMIS[i]["os"]
},
{
'Key' : 'env',
'Value': 'ansible'
},
{
'Key' : 'distro',
'Value': AMIS[i]["distro"]
}
]
}
]
)
DYNAMIC INVENTORY
Once the instances are running instead of updating the inventory file manually we can use the ansible plugin: aws_ec2 to make our inventory dynamic.
Here you can see the inventory file that groups our EC2 instances by their tags, in this case, distro.
The name of the file is important and needs to be inventory_aws_ec2.yml
plugin: aws_ec2
boto_profile: default
regions:
- us-east-1
filters:
tag:env:
- ansible
keyed_groups:
- key: tags.distro
separator: ''
hostnames:
- network-interface.association.public-ip
OUTPUT
Notice that the output groups the distribution name with the public IP address assigned to the EC2 instance.
You can use this command to list the dynamic inventory:
ansible-inventory -i inventory_aws_ec2.yml --list
The output is going to look something like this:
{
"aws_ec2": {
"hosts": [
"18.232.x.x",
"34.228.x.x",
"34.230.x.x",
"54.226.x.x",
]
},
"centos": {
"hosts": [
"18.232.x.x",
"34.228.x.x"
]
},
"ubuntu": {
"hosts": [
"54.226.x.x",
"54.234.x.x"
]
}
}
RUN THE PLAYBOOK
And finally, you can run your playbook using the dynamic inventory:
ansible-playbook -u ubuntu play.yml
--------
- hosts: ubuntu
become: true
roles:
- ansible-role-update
Don't forget to terminate your instances after testing.
Top comments (0)