def create_webapp_instances(c, count, domain, security_groups, tags): tags["Role"] = "app-server" # Launch a vanilla amazon linux ami ec2_ids = launch_base_image(c, 1, security_groups, tags) print "New ID: ", ec2_ids new_id = ec2_ids[0] new_ami_id = None # Turn the EC2 instance into a viable app host extra_env = {"ANSIBLE_SERVICE_DOMAIN": domain} run_playbook_on_instances_by_ids(c, "aws_mess_around/playbooks/basics.yml", [new_id], extra_env) # XXX - this should be named based on the project/what-not! new_ami_id = create_ami_from_instance(c, new_id, MY_AMI_NAME, tags) # Launch webapp instances from the new ami we created. new_ids = launch_ami(c, new_ami_id, count, security_groups, tags) return new_ids
def create_proxy_instances(c, domain, count, security_groups, tags): tags["Role"] = "reverse-proxy" ec2_ids = launch_base_image(c, count, security_groups, tags) playbook = "aws_mess_around/playbooks/proxy/build_proxy.yml" run_playbook_on_instances_by_ids(c, playbook, ec2_ids) set_app_servers_for_proxies_by_id(c, domain, ec2_ids, []) return ec2_ids
def create_proxy_instances(c, domain, count, security_groups, tags): tags["Role"] = "reverse-proxy" ec2_ids = launch_base_image(c, count, security_groups, tags) playbook = "aws_mess_around/playbooks/proxy/build_proxy.yml" run_playbook_on_instances_by_ids( c, playbook, ec2_ids, ) set_app_servers_for_proxies_by_id(c, domain, ec2_ids, []) return ec2_ids
def add_database_to_host_id(c, database, instance_id, password): """ Adds a database to the database server at the given instance """ session = c["session"] region_name = c["region_name"] ec2_client = session.client("ec2") ec2_region = session.resource('ec2', region_name=region_name) playbook = "aws_mess_around/playbooks/db/add_database.yml" data = {"database": database, "root_password": password} host = ec2_region.Instance(instance_id) run_playbook_on_instances_by_ids(c, playbook, [instance_id], data=data)
def create_db_instance(c, security_groups, tags, server_id): tags["Role"] = "database" ec2_ids = launch_base_image(c, 1, security_groups, tags) print "IDs: ", ec2_ids playbook = "aws_mess_around/playbooks/db/build_database.yml" password = generate_password() print "Setting root password: "******"ANSIBLE_MYSQL_ROOT": password, "ANSIBLE_MYSQL_SERVER_ID": "%s" % server_id } run_playbook_on_instances_by_ids(c, playbook, ec2_ids, env) return ec2_ids[0], password
def create_db_instance(c, security_groups, tags, server_id): tags["Role"] = "database" ec2_ids = launch_base_image(c, 1, security_groups, tags) print "IDs: ", ec2_ids playbook = "aws_mess_around/playbooks/db/build_database.yml" password = generate_password() print "Setting root password: "******"ANSIBLE_MYSQL_ROOT": password, "ANSIBLE_MYSQL_SERVER_ID": "%s" % server_id} run_playbook_on_instances_by_ids(c, playbook, ec2_ids, env) return ec2_ids[0], password
def add_slave_to_master_by_ids(c, master_id, master_pwd, slave_id, slave_pwd): """ Add the mysql host at host slave_id as a replication slave to the mysql host at host master_id. Username for both is assumed to be root. This *only* works for initial setup. """ session = c["session"] region_name = c["region_name"] ec2_client = session.client("ec2") ec2_region = session.resource('ec2', region_name=region_name) master = ec2_region.Instance(master_id) slave = ec2_region.Instance(slave_id) repl_pwd = generate_password(10) env = {"ANSIBLE_MYSQL_MASTER_PASSWORD": master_pwd, "ANSIBLE_MYSQL_REPL_PASSWORD": repl_pwd, "ANSIBLE_MYSQL_SLAVE_IP": slave.private_ip_address, } # Grant access to the slave... master_playbook = "aws_mess_around/playbooks/db/add_slave_access.yml" run_playbook_on_instances_by_ids(c, master_playbook, [master_id], env) env = {"ANSIBLE_MYSQL_SLAVE_PASSWORD": slave_pwd, "ANSIBLE_MYSQL_REPL_PASSWORD": repl_pwd, "ANSIBLE_MYSQL_MASTER_IP": master.private_ip_address, } # Read the master status, and connect slave_playbook = "aws_mess_around/playbooks/db/join_master.yml" run_playbook_on_instances_by_ids(c, slave_playbook, [slave_id], env)
def set_app_servers_for_proxies_by_id(c, domain, proxy_ids, app_server_ids): session = c["session"] region_name = c["region_name"] ec2_client = session.client('ec2') ec2_region = session.resource('ec2', region_name=region_name) # XXX - make this configurable per service, at least url = "http://depts.washington.edu/sacg/news/static/catalyst_offline.html" data = {"app_servers": [], "domain": domain, "emergency_offline_url": url} for iid in app_server_ids: instance = ec2_region.Instance(iid) data["app_servers"].append(instance.private_ip_address) playbook = "aws_mess_around/playbooks/proxy/set_proxy_backends.yml" env = {} run_playbook_on_instances_by_ids(c, playbook, proxy_ids, data=data)
def set_app_servers_for_proxies_by_id(c, domain, proxy_ids, app_server_ids): session = c["session"] region_name = c["region_name"] ec2_client = session.client("ec2") ec2_region = session.resource("ec2", region_name=region_name) # XXX - make this configurable per service, at least url = "http://depts.washington.edu/sacg/news/static/catalyst_offline.html" data = {"app_servers": [], "domain": domain, "emergency_offline_url": url} for iid in app_server_ids: instance = ec2_region.Instance(iid) data["app_servers"].append(instance.private_ip_address) playbook = "aws_mess_around/playbooks/proxy/set_proxy_backends.yml" env = {} run_playbook_on_instances_by_ids(c, playbook, proxy_ids, data=data)
def add_slave_to_master_by_ids(c, master_id, master_pwd, slave_id, slave_pwd): """ Add the mysql host at host slave_id as a replication slave to the mysql host at host master_id. Username for both is assumed to be root. This *only* works for initial setup. """ session = c["session"] region_name = c["region_name"] ec2_client = session.client("ec2") ec2_region = session.resource('ec2', region_name=region_name) master = ec2_region.Instance(master_id) slave = ec2_region.Instance(slave_id) repl_pwd = generate_password(10) env = { "ANSIBLE_MYSQL_MASTER_PASSWORD": master_pwd, "ANSIBLE_MYSQL_REPL_PASSWORD": repl_pwd, "ANSIBLE_MYSQL_SLAVE_IP": slave.private_ip_address, } # Grant access to the slave... master_playbook = "aws_mess_around/playbooks/db/add_slave_access.yml" run_playbook_on_instances_by_ids(c, master_playbook, [master_id], env) env = { "ANSIBLE_MYSQL_SLAVE_PASSWORD": slave_pwd, "ANSIBLE_MYSQL_REPL_PASSWORD": repl_pwd, "ANSIBLE_MYSQL_MASTER_IP": master.private_ip_address, } # Read the master status, and connect slave_playbook = "aws_mess_around/playbooks/db/join_master.yml" run_playbook_on_instances_by_ids(c, slave_playbook, [slave_id], env)
def add_user_to_database(c, user, host, password, db, instance, root_password): """ Grants the user @ host all privs on a given db on an instance. """ session = c["session"] region_name = c["region_name"] ec2_client = session.client("ec2") ec2_region = session.resource('ec2', region_name=region_name) playbook = "aws_mess_around/playbooks/db/add_user.yml" data = {"user": user, "password": password, "database": db, "host": host, "root_password": root_password} print "D: ", data host = ec2_region.Instance(instance) run_playbook_on_instances_by_ids(c, playbook, [instance], data=data)
def add_user_to_database(c, user, host, password, db, instance, root_password): """ Grants the user @ host all privs on a given db on an instance. """ session = c["session"] region_name = c["region_name"] ec2_client = session.client("ec2") ec2_region = session.resource('ec2', region_name=region_name) playbook = "aws_mess_around/playbooks/db/add_user.yml" data = { "user": user, "password": password, "database": db, "host": host, "root_password": root_password } print "D: ", data host = ec2_region.Instance(instance) run_playbook_on_instances_by_ids(c, playbook, [instance], data=data)
def handle(self, *args, **kwargs): c = get_context() if False: cleanup_all(c) # Find or create a DB cluster to use. db_settings = get_database_config_for_project(c, "myuw", "aws_mess_around") print "DB settings: ", db_settings # Find or create the proxies the app servers will live behind. proxy_settings = get_proxy_config_for_project(c, "myuw", "aws_mess_around") print "Proxy settings: ", proxy_settings # Get a base image to do build a MyUW AMI off of my_security_group = settings.AWS_SECURITY_GROUP_NAME tags = { "Project": "myuw", "Use": "messing-around", "ResponsibleParty": settings.AWS_RESPONSIBLE_PARTY, } # instance_ids = create_webapp_instances(c, 1, DEMO_DOMAIN, # [my_security_group], tags) # instance_id = instance_ids[0] instance_id = 'i-d7d3370f' print "Our base instance ID: ", instance_id # Get the host ready to be a MyUW app server playbook = "aws_mess_around/playbooks/app/prep_host.yml" urls = [ "url(r'^support', include('userservice.urls'))", "url(r'^restclients/', include('restclients.urls'))", "url(r'^logging/', include('django_client_logger.urls'))", "url(r'^', include('myuw.urls'))" ] # XXX - this should change when the memcached work is implemented. cache = "myuw.util.cache_implementation.MyUWCache" secret_key = get_secret_key_for_project("myuw", "aws_mess_around") extra_settings = "templates/myuw/project_settings.py" data = { "files_dir": settings.AWS_FILES_PATH, "file_group": "ubuntu", "webservice_client_cert_name": "myuw-uwca.cert", "webservice_client_key_name": "myuw-uwca.key", # "build_number": get_next_build_for_project("myuw"), "build_number": 8, "git_repository": "https://github.com/uw-it-aca/myuw.git", "git_version": "feature/aws-shibboleth", "pip_requirements_files": ["requirements.txt"], "project_url_definitions": urls, "database_name": "myuw", "database_user": db_settings["username"], "database_password": db_settings["password"], "database_host": db_settings["host"], "allowed_hosts": [DEMO_DOMAIN], "secret_key": secret_key, "digitlib_client_redirect": False, "userservice_admin_group": "u_pmichaud_myuwdevtesters", "restclients_admin_group": "u_pmichaud_myuwdevtesters", "restclients_dao_cache_class": cache, "project_settings_template": extra_settings, "migrate_apps": ["myuw"], "shib_required_url": "/", "restclients": { "test": [], "production": [ "gws", "sws", "pws", "hfs", "book", "uwnetid", "canvas", "libraries", "trumba_calendar", "digit_lib", "iasystem", "grad" ], }, } run_playbook_on_instances_by_ids(c, playbook, [instance_id], data=data, vars_file="aws/myuw/production.json") # Add our instances to the proxy proxy_ids = [proxy_settings["instance_id"]] # set_app_servers_for_proxies_by_id(c, DEMO_DOMAIN, proxy_ids, # [instance_id]) instance = get_instance(c, instance_id) print "IP: ", instance.public_ip_address
def handle(self, *args, **kwargs): c = get_context() if False: cleanup_all(c) # Find or create a DB cluster to use. db_settings = get_database_config_for_project(c, "myuw", "aws_mess_around") print "DB settings: ", db_settings # Find or create the proxies the app servers will live behind. proxy_settings = get_proxy_config_for_project(c, "myuw", "aws_mess_around") print "Proxy settings: ", proxy_settings # Get a base image to do build a MyUW AMI off of my_security_group = settings.AWS_SECURITY_GROUP_NAME tags = {"Project": "myuw", "Use": "messing-around", "ResponsibleParty": settings.AWS_RESPONSIBLE_PARTY, } # instance_ids = create_webapp_instances(c, 1, DEMO_DOMAIN, # [my_security_group], tags) # instance_id = instance_ids[0] instance_id = 'i-d7d3370f' print "Our base instance ID: ", instance_id # Get the host ready to be a MyUW app server playbook = "aws_mess_around/playbooks/app/prep_host.yml" urls = ["url(r'^support', include('userservice.urls'))", "url(r'^restclients/', include('restclients.urls'))", "url(r'^logging/', include('django_client_logger.urls'))", "url(r'^', include('myuw.urls'))" ] # XXX - this should change when the memcached work is implemented. cache = "myuw.util.cache_implementation.MyUWCache" secret_key = get_secret_key_for_project("myuw", "aws_mess_around") extra_settings = "templates/myuw/project_settings.py" data = {"files_dir": settings.AWS_FILES_PATH, "file_group": "ubuntu", "webservice_client_cert_name": "myuw-uwca.cert", "webservice_client_key_name": "myuw-uwca.key", # "build_number": get_next_build_for_project("myuw"), "build_number": 8, "git_repository": "https://github.com/uw-it-aca/myuw.git", "git_version": "feature/aws-shibboleth", "pip_requirements_files": ["requirements.txt"], "project_url_definitions": urls, "database_name": "myuw", "database_user": db_settings["username"], "database_password": db_settings["password"], "database_host": db_settings["host"], "allowed_hosts": [DEMO_DOMAIN], "secret_key": secret_key, "digitlib_client_redirect": False, "userservice_admin_group": "u_pmichaud_myuwdevtesters", "restclients_admin_group": "u_pmichaud_myuwdevtesters", "restclients_dao_cache_class": cache, "project_settings_template": extra_settings, "migrate_apps": ["myuw"], "shib_required_url": "/", "restclients": {"test": [], "production": ["gws", "sws", "pws", "hfs", "book", "uwnetid", "canvas", "libraries", "trumba_calendar", "digit_lib", "iasystem", "grad"], }, } run_playbook_on_instances_by_ids(c, playbook, [instance_id], data=data, vars_file="aws/myuw/production.json") # Add our instances to the proxy proxy_ids = [proxy_settings["instance_id"]] # set_app_servers_for_proxies_by_id(c, DEMO_DOMAIN, proxy_ids, # [instance_id]) instance = get_instance(c, instance_id) print "IP: ", instance.public_ip_address