Created
November 21, 2019 18:39
-
-
Save NewAlexandria/1eed68703dfaab04d2a1401712436f4d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
"""AWS EC2 SSH config Generator.""" | |
# edit these: | |
# * path_to_config | |
# * path_to_ssh_key | |
# remember the path_to_config must be write-able by the script | |
# before running, install aws_cli and login with your credentials | |
# then move to your .ssh folder and in your .ssh/config file | |
# add an Include line like /Users/zak/.ssh/parsec-ec2-tunnel-config | |
import boto3 | |
import os | |
import pprint | |
pp = pprint.PrettyPrinter(indent=2) | |
# The location and name of our generated config file | |
path_to_config = '/src/work/parsec-ec2-tunnel-config' | |
# The SSH key we use to connet to those instances | |
path_to_ssh_key = "/Users/zak/.ssh/zak/parsec/keys/name-of-your.pem" | |
# The SSH username to use | |
instance_username = 'centos' | |
# The SSH port to connect to | |
ssh_port = 22 | |
def main(): | |
"""Main.""" | |
try: | |
""" | |
Using the security credentialsa and the location we set | |
when we run `$ awscli configure` we connect to AWS | |
and get the list of instances on the specific location | |
""" | |
aws_client = boto3.client('ec2') | |
paginator = aws_client.get_paginator('describe_instances') | |
response_iterator = paginator.paginate( | |
DryRun=False, | |
PaginationConfig={ | |
'MaxItems': 100, | |
'PageSize': 10 | |
} | |
) | |
""" | |
Open the config file we specified to be written | |
""" | |
ssh_config_file = open(os.path.expanduser( | |
'~') + path_to_config, 'w') | |
ssh_config_file.write("##########################\n") | |
ssh_config_file.write("##### AWS SSH CONFIG #####\n") | |
ssh_config_file.write("##########################\n\n") | |
""" | |
We iterate the results and read the tags for each instance. | |
Using those tags we create an ssh config entry for each instance. | |
and append it to the config file. | |
host <client>.<environment>.<name> | |
Hostname <ec2-public-ip> | |
IdentityFile <path_to_ssh_key> | |
User <instance_username> | |
port <ssh_port> | |
""" | |
def find_tag_by_name(resv): | |
for tag in resv['Tags']: | |
if tag['Key'] == 'Name': | |
tag['Value'] | |
names = [] | |
for page in response_iterator: | |
for reservation in page['Reservations']: | |
# sorted_instances = sorted(reservation['Instances'], key=find_tag_by_name) | |
for instance in reservation['Instances']: | |
# names.append( find_tag_by_name(instance) ) | |
try: | |
host_line = "" | |
host = "" | |
env = "" | |
if 'PublicIpAddress' in instance: | |
public_ip = instance['PublicIpAddress'] | |
dns = instance['PublicDnsName'] | |
for tag in instance['Tags']: | |
if tag['Key'] == "Client": | |
client = tag['Value'] | |
if tag['Key'] == "Name": | |
name = tag['Value'] | |
if tag['Key'] == "Environment": | |
env = tag['Value'] | |
# pp.pprint(instance or 'none') | |
# host = "{}.{}.{}".format( | |
# client, env, name).replace(" ", "-") | |
host_line += "##########################\n" | |
host_line += "host {}\n".format(name) | |
host_line += " Hostname {}\n".format(dns) | |
host_line += " IdentityFile {}\n".format( | |
path_to_ssh_key) | |
host_line += " User {}\n".format( | |
instance_username) | |
host_line += " port {}\n".format(ssh_port) | |
host_line += "##########################\n" | |
host_line += "\n" | |
ssh_config_file.write(host_line) | |
except Exception as e: | |
raise e | |
print("File updated: " + os.path.expanduser('~') + path_to_config) | |
print(names) | |
except Exception as e: | |
print(e) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment