SlideShare a Scribd company logo
Nuvola: a tale of migration to AWS
Ansible + AWS: victory is mine!
Who am I?
Matteo Moretti
Who I am?
CTO @
website: madisoft.it
tech blog: labs.madisoft.it
It’s a story
●It’s our story
●It’s about a migration
●We did it!
●We’ve learnt a lot
●We want to share it with you
Nuvola
●~ 2M users
●~ 1000 databases
●~ 350GB of mysql data
●~ 25M of media files
●~ 4.50TB of media files
●~ 60 servers
Why a migration?
No automation, flexibility and autoscaling
Need of change
●Flexibility
●Horizontal scaling
●Infrastructure as code
●Multiple environments
●All services by one provider
●Cost optimization
pixabay.com
Change is coming
isn’t it?
pixabay.com
Obstacles
●It’s a distributed app
●Learn an entire new ecosystem
●Causing no troubles for users
●Few weeks of time
Tools and solutions
AWS
●100% automation
●Tons of services
●Very well integrated with Ansible
●IaaS services
●Autoscaling / Reserved instances / Spot instances
AWS
Autoscaling + reserverd instances + spot instances
Optimizing services while reducing costs
AWS
Ansible
●IT automation tool
●Easy lo learn
●No coding skills. It uses YAML
●No agents on target machines
●Ready-made AWS modules
●Can be easily idempotent
Ansible & AWS
AWS Azure Cloudstack Digital Ocean Google
86 18 31 5 10
Openstack Ovh Rackspace Softlayer Vmware
52 1 26 1 26
http://docs.ansible.com/ansible/list_of_cloud_modules.html
Ansible & AWS
ec2 - Create, terminate, start or stop an instance in ec2
http://docs.ansible.com/ansible/ec2_module.html
ec2_asg - Create or delete AWS Autoscaling Groups
http://docs.ansible.com/ansible/ec2_asg_module.html
ec2_elb_lb - Creates or destroys Amazon ELB.
http://docs.ansible.com/ansible/ec2_elb_lb_module.html
ec2_snapshot - creates a snapshot from an existing volume
http://docs.ansible.com/ansible/ec2_snapshot_module.html
ec2_tag - create and remove tag(s) to ec2 resources.
http://docs.ansible.com/ansible/ec2_tag_module.html
s3 - manage objects in S3.
http://docs.ansible.com/ansible/s3_module.html
route53 - add or delete entries in Amazons Route53 DNS service
http://docs.ansible.com/ansible/route53_module.html
Nuvola
Multiple environments
● ./infrastructure_nuvola_env_aws.sh --env prod
● ./infrastructure_nuvola_env_aws.sh --env dev
● ./infrastructure_nuvola_env_aws.sh --env lavorazione
Infrastructure
./infrastructure_nuvola_env_aws.sh --env prod
#!/bin/bash
. libs/limit_option_parser.sh
….
ansible-playbook
--vault-password-file secrets/infrastructure_nuvola_env.secret 
ansible/infrastucture_nuvola_env.yml 
-e"$EXTRA_OPTIONS"
….
Infrastructure playbook
infrastructure_nuvola_env.yml
tasks:
- include: .../infrastructure_nuvola_vpc.yml
tags: vpc
- include: .../infrastructure_nuvola_ec2.yml
tags: ec2
- include: .../infrastructure_nuvola_elb.yml
tags: elb
- include: .../infrastructure_nuvola_destroy.yml
when: destroy == "true" and nuvola_env != "prod"
VPC
tasks/infrastructure_nuvola_vpc.yml
- name: INFRASTRUCTURE NUVOLA VPC | setting up vpc
ec2_vpc:
state: present
cidr_block: 10.0.0.0/16
resource_tags: {
Name: "nuvola_{{ nuvola_env }}_vpc",
nuvola_env: '{{ nuvola_env }}',
nuvola_role: "vpc",
billing: "{{ billing_tag_value }}"
}
az: eu-west-1a
internet_gateway: True
register: vpc
VPC
infrastructure_nuvola_vpc.yml
- name: INFRASTRUCTURE NUVOLA VPC | vpc peering route
ec2_vpc_route_table:
vpc_id: "{{ vpc['vpc']['id'] }}"
tags:
Name: "nuvola_{{ nuvola_env }}_to_nuvola_default"
subnets:
- "10.0.{{ ec2_vpc_subnet }}.0/24"
routes:
- dest: 0.0.0.0/0
gateway_id: "{{ vpc.igw_id }}"
http://docs.ansible.com/ansible/ec2_vpc_route_table_module.html
ELB
infrastructure_nuvola_elb.yml
- name: INFRASTRUCTURE NUVOLA ELB | Setup ELB
ec2_elb_lb:
state: present
name: 'nuvola-{{ nuvola_env }}-elb'
listeners:
- protocol: http
load_balancer_port: 80
instance_port: 80
- protocol: https
load_balancer_port: 443
instance_protocol: http
instance_port: 80
ssl_certificate_id: '{{ output.stdout }}'
http://docs.ansible.com/ansible/ec2_elb_lb_module.html
EC2 backend
infrastructure_nuvola_ec2.yml
- name: INFRASTRUCTURE NUVOLA EC2 | Init backend instances
ec2:
key_name: '{{ ec2_key_name }}'
instance_type: '{{ backend_instance_type }}'
instance_tags:
nuvola_type: "{{ nuvola_env }}_backend"
nuvola_env: '{{ nuvola_env }}'
nuvola_role: "backend"
billing: "{{ billing_tag_value }}"
image: "{{ ec2_ami_id }}"
zone: "{{ ec2_zone }}"
wait: yes
wait_timeout: 600
group: "nuvola_{{ nuvola_env }}_backend_sg"
http://docs.ansible.com/ansible/ec2_module.html
EC2 backend
infrastructure_nuvola_ec2.yml
count_tag:
nuvola_type: "{{ nuvola_env }}_backend"
exact_count: '{{ nuvola_backend_ec2_instances }}'
vpc_subnet_id: "{{ vpc['subnets'][0]['id'] }}"
assign_public_ip: yes
termination_protection: "{{ delete_lock }}"
volumes:
- device_name: /dev/sda1
volume_type: gp2
volume_size: "{{ ec2_volume_size_backend }}"
delete_on_termination: true
instance_profile_name: "{{ ec2_instance_role }}"
register: ec2_backend
http://docs.ansible.com/ansible/ec2_module.html
Provisioning
./provision_nuvola_backend.sh --limit "tag_nuvola_type_${ENV}_backend"
./provision_nuvola_dbserver.sh --limit "tag_nuvola_type_${ENV}_database"
./provision_nuvola_routine.sh --limit "tag_nuvola_type_${ENV}_routine"
if [ "$ENV" != "prod" ]; then
./nuvola-init-not-prod-env.sh --env ${ENV}
./deploy_nuvola.sh --limit "tag_nuvola_type_${ENV}_backend" --env $
{ENV}
fi
Provisioning PHP7
roles/php7/tasks/php7_prod.yml
- name: PHP7 ALL | install php packages
apt: pkg={{ item }} state=latest update_cache=yes
with_items: '{{ php7_packages }}'
- name: PHP7 ALL | Set php.ini CLI
template:
src=roles/php7/templates/nuvola/php.ini.cli.j2
dest=/etc/php/7.0/cli/php.ini
- name: PHP7 ALL | Set php.ini php-fpm
template:
src=roles/php7/templates/nuvola/php.ini.web.j2
dest=/etc/php/7.0/fpm/php.ini
Multiple env: how do I find it?
Route 53
● Public DNS
○ nuvola-prod-backend-3.ops.madisoft.it
○ nuvola-prod-database-24.ops.madisoft.it
○ nuvola-dev-database-34.ops.madisoft.it
○ nuvola-issue8978-database-34.ops.madisoft.it
● Private DNS
○ local-prod-backend-0.ops.madisoft.it
○ local-prod-cache-sessioni-0.ops.madisoft.it
○ local-dev-database-14.ops.madisoft.it
○ local-issue8978-backend-0.ops.madisoft.it
pixabay.com
DNS
infrastructure_nuvola_ec2.yml
- name: INFRASTRUCTURE NUVOLA EC2 | Assign backend dns
route53:
command: create
zone: "{{ domain_tld }}"
record: "nuvola-{{ nuvola_env }}-backend-{{ item.0 }}.
{{ domain_tld }}"
type: A
value: '{{ item.1.public_ip }}'
overwrite: yes
ttl: "{{ ttl_expire }}"
with_indexed_items: '{{ ec2_backend.instances }}'
nuvola-prod-backend-3.ops.madisoft.it
http://docs.ansible.com/ansible/route53_module.html
DNS: local
infrastructure_nuvola_ec2.yml
- name: INFRASTRUCTURE NUVOLA EC2 | Assign database local
dns
route53:
command: create
zone: "{{ domain_tld }}"
record: "local-{{ nuvola_env }}-database-{{ item.0 }}.
{{ domain_tld }}"
type: A
value: '{{ item.1.private_ip }}'
overwrite: yes
with_indexed_items: '{{ ec2_database.instances }}'
local-dev-database-14.ops.madisoft.it
http://docs.ansible.com/ansible/route53_module.html
DNS: local
infrastructure_nuvola_ec2.yml
- name: INFRASTRUCTURE NUVOLA EC2 | Assign database local
dns
route53:
command: create
zone: "{{ domain_tld }}"
record: "local-{{ nuvola_env }}-database-{{ item.0 }}.
{{ domain_tld }}"
type: A
value: '{{ item.1.private_ip }}'
overwrite: yes
with_indexed_items: '{{ ec2_database.instances }}'
local-dev-database-14.ops.madisoft.it
http://docs.ansible.com/ansible/route53_module.html
Ready to move?
Warm up
Moving:
- static files from a shared NAS to S3
- external standalone services to ec2
- Jenkins CI to AWS
- ELK stack to AWS
- (and testing) Nuvola stage environment
Switch of
- Stop current app
- Create prod env infrastructure
- App deployment
- Copy db data
Infrastructure
./infrastructure_nuvola_env_aws.sh --env prod
#!/bin/bash
. libs/limit_option_parser.sh
….
ansible-playbook
--vault-password-file secrets/infrastructure_nuvola_env.secret 
ansible/infrastucture_nuvola_env.yml 
-e"$EXTRA_OPTIONS"
….
Migration with sharding
Db data migration
Many small databases on diferent machines
Use of parallelization
Mysql_migrate_dbserver.sh
….
ansible-playbook -l $LIMIT 
ansible/mysql_migrate_dbserver.yml -e "nuvola_env=$ENV" 
--vault-password-file ./secrets/provision_nuvola_dbserver.secret
….
App deploy
deploy_nuvola.sh
ansible-playbook
ansible/deploy_nuvola.yml
--extra-vars="nuvola_env=$ENV"
Switch of
Total time: ~ 50m
Achievement
Amazing
migration!
WE ARE
HIRING!(wanna join? ask us at the end of the talk or visit our website)
@mat_teo8
matteo.moretti@madisoft.it

More Related Content

PDF
Scaling symfony apps
PPTX
JahiaOne - Performance Tuning
PPT
Speeding Up The Snail
PDF
Percona Toolkit for Effective MySQL Administration
KEY
Introduction to memcached
PDF
Challenges when building high profile editorial sites
PDF
Advanced Apache Cassandra Operations with JMX
PDF
Spark / Mesos Cluster Optimization
Scaling symfony apps
JahiaOne - Performance Tuning
Speeding Up The Snail
Percona Toolkit for Effective MySQL Administration
Introduction to memcached
Challenges when building high profile editorial sites
Advanced Apache Cassandra Operations with JMX
Spark / Mesos Cluster Optimization

What's hot (20)

PPTX
ODP
phptek13 - Caching and tuning fun tutorial
PDF
Behind the Scenes at LiveJournal: Scaling Storytime
PDF
Postgres connections at scale
PPT
Capacity Management from Flickr
PDF
MariaDB, MySQL and Ansible: automating database infrastructures
PDF
Memcached Presentation
PDF
Perl Stored Procedures for MySQL (2009)
PDF
Containers > VMs
PDF
A Detailed Look At cassandra.yaml (Edward Capriolo, The Last Pickle) | Cassan...
PPTX
MongoDB: tips, trick and hacks
PDF
Memcached Study
PPTX
Using memcache to improve php performance
PDF
Varnish Configuration Step by Step
PPT
Memcache
PDF
How to scale PHP applications
PDF
Bottom to Top Stack Optimization - CICON2011
PDF
Caching with Varnish
PDF
Dbdeployer, the universal installer
PDF
Clug 2012 March web server optimisation
phptek13 - Caching and tuning fun tutorial
Behind the Scenes at LiveJournal: Scaling Storytime
Postgres connections at scale
Capacity Management from Flickr
MariaDB, MySQL and Ansible: automating database infrastructures
Memcached Presentation
Perl Stored Procedures for MySQL (2009)
Containers > VMs
A Detailed Look At cassandra.yaml (Edward Capriolo, The Last Pickle) | Cassan...
MongoDB: tips, trick and hacks
Memcached Study
Using memcache to improve php performance
Varnish Configuration Step by Step
Memcache
How to scale PHP applications
Bottom to Top Stack Optimization - CICON2011
Caching with Varnish
Dbdeployer, the universal installer
Clug 2012 March web server optimisation
Ad

Viewers also liked (20)

PDF
How Docker EE is Finnish Railway’s Ticket to App Modernization
PDF
Online Communities
PPTX
Failing at Scale - PNWPHP 2016
PDF
114 Numalliance
PDF
AtlasCamp 2015: How HipChat ships at the speed of awesome
PDF
AppSphere 15 - Containers and Microservices Create New Performance Challenges
PPTX
LJC Mashup "Building Java Microservices for the Cloud && Chuck Norris Doesn't...
PDF
TrendsByte Presentation
PDF
Gsm jammer
PDF
Doç. Dr. Mehmet Ali GÜLÇELİK
PDF
Regex Considered Harmful: Use Rosie Pattern Language Instead
PPTX
EVOLVE'16 | Enhance | Anil Kalbag & Anshul Chhabra | Comparative Architecture...
PDF
Bbc jan13 ftth_households
PDF
Ecce de-gids nl
PDF
Cloud Foundry Logging and Metrics
DOC
"Mini Texts"
PDF
LXC - kontener pingwinów
PPTX
Incident Response in the wake of Dear CEO
PPTX
Honey Potz - BSides SLC 2015
PDF
Your data is in Prometheus, now what? (CurrencyFair Engineering Meetup, 2016)
How Docker EE is Finnish Railway’s Ticket to App Modernization
Online Communities
Failing at Scale - PNWPHP 2016
114 Numalliance
AtlasCamp 2015: How HipChat ships at the speed of awesome
AppSphere 15 - Containers and Microservices Create New Performance Challenges
LJC Mashup "Building Java Microservices for the Cloud && Chuck Norris Doesn't...
TrendsByte Presentation
Gsm jammer
Doç. Dr. Mehmet Ali GÜLÇELİK
Regex Considered Harmful: Use Rosie Pattern Language Instead
EVOLVE'16 | Enhance | Anil Kalbag & Anshul Chhabra | Comparative Architecture...
Bbc jan13 ftth_households
Ecce de-gids nl
Cloud Foundry Logging and Metrics
"Mini Texts"
LXC - kontener pingwinów
Incident Response in the wake of Dear CEO
Honey Potz - BSides SLC 2015
Your data is in Prometheus, now what? (CurrencyFair Engineering Meetup, 2016)
Ad

Similar to Nuvola: a tale of migration to AWS (20)

PDF
Improving Operations Efficiency with Puppet
PDF
Linux Desktop Automation
PPT
SaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
PPTX
I hunt sys admins 2.0
PPTX
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
PDF
OSDC 2013 | Configuration Management and Linux Packages by Schlomo Schapiro
PPTX
drupal ci cd concept cornel univercity.pptx
ODP
Softlayer devops
PDF
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...
PDF
Devops with Python by Yaniv Cohen DevopShift
PDF
A3Sec Advanced Deployment System
PDF
The Kitchen Cloud How To: Automating Joyent SmartMachines with Chef
PDF
Django dev-env-my-way
PPTX
Automating with Ansible
PDF
PaaSTA: Autoscaling at Yelp
PDF
Introduction to PaaS and Heroku
ODP
Deploying Perl apps on dotCloud
PDF
Ansible is the simplest way to automate. MoldCamp, 2015
PDF
Ansible is Our Wishbone(Automate DBA Tasks With Ansible)
PDF
Ansible is Our Wishbone
Improving Operations Efficiency with Puppet
Linux Desktop Automation
SaltConf14 - Ben Cane - Using SaltStack in High Availability Environments
I hunt sys admins 2.0
Puppet Camp Silicon Valley 2015: How TubeMogul reached 10,000 Puppet Deployme...
OSDC 2013 | Configuration Management and Linux Packages by Schlomo Schapiro
drupal ci cd concept cornel univercity.pptx
Softlayer devops
Dynamic tracing of MariaDB on Linux - problems and solutions (MariaDB Server ...
Devops with Python by Yaniv Cohen DevopShift
A3Sec Advanced Deployment System
The Kitchen Cloud How To: Automating Joyent SmartMachines with Chef
Django dev-env-my-way
Automating with Ansible
PaaSTA: Autoscaling at Yelp
Introduction to PaaS and Heroku
Deploying Perl apps on dotCloud
Ansible is the simplest way to automate. MoldCamp, 2015
Ansible is Our Wishbone(Automate DBA Tasks With Ansible)
Ansible is Our Wishbone

Recently uploaded (20)

PPTX
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
PDF
Arduino robotics embedded978-1-4302-3184-4.pdf
PPTX
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
PPT
Project quality management in manufacturing
PPTX
Welding lecture in detail for understanding
PDF
Operating System & Kernel Study Guide-1 - converted.pdf
PDF
Digital Logic Computer Design lecture notes
PPTX
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
PPTX
Strings in CPP - Strings in C++ are sequences of characters used to store and...
PDF
Well-logging-methods_new................
PPTX
Foundation to blockchain - A guide to Blockchain Tech
PPTX
Construction Project Organization Group 2.pptx
PDF
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
PPTX
OOP with Java - Java Introduction (Basics)
DOCX
573137875-Attendance-Management-System-original
PPTX
bas. eng. economics group 4 presentation 1.pptx
PDF
Embodied AI: Ushering in the Next Era of Intelligent Systems
PPTX
web development for engineering and engineering
PDF
Model Code of Practice - Construction Work - 21102022 .pdf
PPTX
Internet of Things (IOT) - A guide to understanding
IOT PPTs Week 10 Lecture Material.pptx of NPTEL Smart Cities contd
Arduino robotics embedded978-1-4302-3184-4.pdf
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
Project quality management in manufacturing
Welding lecture in detail for understanding
Operating System & Kernel Study Guide-1 - converted.pdf
Digital Logic Computer Design lecture notes
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
Strings in CPP - Strings in C++ are sequences of characters used to store and...
Well-logging-methods_new................
Foundation to blockchain - A guide to Blockchain Tech
Construction Project Organization Group 2.pptx
PRIZ Academy - 9 Windows Thinking Where to Invest Today to Win Tomorrow.pdf
OOP with Java - Java Introduction (Basics)
573137875-Attendance-Management-System-original
bas. eng. economics group 4 presentation 1.pptx
Embodied AI: Ushering in the Next Era of Intelligent Systems
web development for engineering and engineering
Model Code of Practice - Construction Work - 21102022 .pdf
Internet of Things (IOT) - A guide to understanding

Nuvola: a tale of migration to AWS

  • 1. Nuvola: a tale of migration to AWS Ansible + AWS: victory is mine!
  • 3. Who I am? CTO @ website: madisoft.it tech blog: labs.madisoft.it
  • 4. It’s a story ●It’s our story ●It’s about a migration ●We did it! ●We’ve learnt a lot ●We want to share it with you
  • 5. Nuvola ●~ 2M users ●~ 1000 databases ●~ 350GB of mysql data ●~ 25M of media files ●~ 4.50TB of media files ●~ 60 servers
  • 6. Why a migration? No automation, flexibility and autoscaling
  • 7. Need of change ●Flexibility ●Horizontal scaling ●Infrastructure as code ●Multiple environments ●All services by one provider ●Cost optimization
  • 11. Obstacles ●It’s a distributed app ●Learn an entire new ecosystem ●Causing no troubles for users ●Few weeks of time
  • 13. AWS ●100% automation ●Tons of services ●Very well integrated with Ansible ●IaaS services ●Autoscaling / Reserved instances / Spot instances
  • 14. AWS Autoscaling + reserverd instances + spot instances Optimizing services while reducing costs
  • 15. AWS
  • 16. Ansible ●IT automation tool ●Easy lo learn ●No coding skills. It uses YAML ●No agents on target machines ●Ready-made AWS modules ●Can be easily idempotent
  • 17. Ansible & AWS AWS Azure Cloudstack Digital Ocean Google 86 18 31 5 10 Openstack Ovh Rackspace Softlayer Vmware 52 1 26 1 26 http://docs.ansible.com/ansible/list_of_cloud_modules.html
  • 18. Ansible & AWS ec2 - Create, terminate, start or stop an instance in ec2 http://docs.ansible.com/ansible/ec2_module.html ec2_asg - Create or delete AWS Autoscaling Groups http://docs.ansible.com/ansible/ec2_asg_module.html ec2_elb_lb - Creates or destroys Amazon ELB. http://docs.ansible.com/ansible/ec2_elb_lb_module.html ec2_snapshot - creates a snapshot from an existing volume http://docs.ansible.com/ansible/ec2_snapshot_module.html ec2_tag - create and remove tag(s) to ec2 resources. http://docs.ansible.com/ansible/ec2_tag_module.html s3 - manage objects in S3. http://docs.ansible.com/ansible/s3_module.html route53 - add or delete entries in Amazons Route53 DNS service http://docs.ansible.com/ansible/route53_module.html
  • 20. Multiple environments ● ./infrastructure_nuvola_env_aws.sh --env prod ● ./infrastructure_nuvola_env_aws.sh --env dev ● ./infrastructure_nuvola_env_aws.sh --env lavorazione
  • 21. Infrastructure ./infrastructure_nuvola_env_aws.sh --env prod #!/bin/bash . libs/limit_option_parser.sh …. ansible-playbook --vault-password-file secrets/infrastructure_nuvola_env.secret ansible/infrastucture_nuvola_env.yml -e"$EXTRA_OPTIONS" ….
  • 22. Infrastructure playbook infrastructure_nuvola_env.yml tasks: - include: .../infrastructure_nuvola_vpc.yml tags: vpc - include: .../infrastructure_nuvola_ec2.yml tags: ec2 - include: .../infrastructure_nuvola_elb.yml tags: elb - include: .../infrastructure_nuvola_destroy.yml when: destroy == "true" and nuvola_env != "prod"
  • 23. VPC tasks/infrastructure_nuvola_vpc.yml - name: INFRASTRUCTURE NUVOLA VPC | setting up vpc ec2_vpc: state: present cidr_block: 10.0.0.0/16 resource_tags: { Name: "nuvola_{{ nuvola_env }}_vpc", nuvola_env: '{{ nuvola_env }}', nuvola_role: "vpc", billing: "{{ billing_tag_value }}" } az: eu-west-1a internet_gateway: True register: vpc
  • 24. VPC infrastructure_nuvola_vpc.yml - name: INFRASTRUCTURE NUVOLA VPC | vpc peering route ec2_vpc_route_table: vpc_id: "{{ vpc['vpc']['id'] }}" tags: Name: "nuvola_{{ nuvola_env }}_to_nuvola_default" subnets: - "10.0.{{ ec2_vpc_subnet }}.0/24" routes: - dest: 0.0.0.0/0 gateway_id: "{{ vpc.igw_id }}" http://docs.ansible.com/ansible/ec2_vpc_route_table_module.html
  • 25. ELB infrastructure_nuvola_elb.yml - name: INFRASTRUCTURE NUVOLA ELB | Setup ELB ec2_elb_lb: state: present name: 'nuvola-{{ nuvola_env }}-elb' listeners: - protocol: http load_balancer_port: 80 instance_port: 80 - protocol: https load_balancer_port: 443 instance_protocol: http instance_port: 80 ssl_certificate_id: '{{ output.stdout }}' http://docs.ansible.com/ansible/ec2_elb_lb_module.html
  • 26. EC2 backend infrastructure_nuvola_ec2.yml - name: INFRASTRUCTURE NUVOLA EC2 | Init backend instances ec2: key_name: '{{ ec2_key_name }}' instance_type: '{{ backend_instance_type }}' instance_tags: nuvola_type: "{{ nuvola_env }}_backend" nuvola_env: '{{ nuvola_env }}' nuvola_role: "backend" billing: "{{ billing_tag_value }}" image: "{{ ec2_ami_id }}" zone: "{{ ec2_zone }}" wait: yes wait_timeout: 600 group: "nuvola_{{ nuvola_env }}_backend_sg" http://docs.ansible.com/ansible/ec2_module.html
  • 27. EC2 backend infrastructure_nuvola_ec2.yml count_tag: nuvola_type: "{{ nuvola_env }}_backend" exact_count: '{{ nuvola_backend_ec2_instances }}' vpc_subnet_id: "{{ vpc['subnets'][0]['id'] }}" assign_public_ip: yes termination_protection: "{{ delete_lock }}" volumes: - device_name: /dev/sda1 volume_type: gp2 volume_size: "{{ ec2_volume_size_backend }}" delete_on_termination: true instance_profile_name: "{{ ec2_instance_role }}" register: ec2_backend http://docs.ansible.com/ansible/ec2_module.html
  • 28. Provisioning ./provision_nuvola_backend.sh --limit "tag_nuvola_type_${ENV}_backend" ./provision_nuvola_dbserver.sh --limit "tag_nuvola_type_${ENV}_database" ./provision_nuvola_routine.sh --limit "tag_nuvola_type_${ENV}_routine" if [ "$ENV" != "prod" ]; then ./nuvola-init-not-prod-env.sh --env ${ENV} ./deploy_nuvola.sh --limit "tag_nuvola_type_${ENV}_backend" --env $ {ENV} fi
  • 29. Provisioning PHP7 roles/php7/tasks/php7_prod.yml - name: PHP7 ALL | install php packages apt: pkg={{ item }} state=latest update_cache=yes with_items: '{{ php7_packages }}' - name: PHP7 ALL | Set php.ini CLI template: src=roles/php7/templates/nuvola/php.ini.cli.j2 dest=/etc/php/7.0/cli/php.ini - name: PHP7 ALL | Set php.ini php-fpm template: src=roles/php7/templates/nuvola/php.ini.web.j2 dest=/etc/php/7.0/fpm/php.ini
  • 30. Multiple env: how do I find it? Route 53 ● Public DNS ○ nuvola-prod-backend-3.ops.madisoft.it ○ nuvola-prod-database-24.ops.madisoft.it ○ nuvola-dev-database-34.ops.madisoft.it ○ nuvola-issue8978-database-34.ops.madisoft.it ● Private DNS ○ local-prod-backend-0.ops.madisoft.it ○ local-prod-cache-sessioni-0.ops.madisoft.it ○ local-dev-database-14.ops.madisoft.it ○ local-issue8978-backend-0.ops.madisoft.it pixabay.com
  • 31. DNS infrastructure_nuvola_ec2.yml - name: INFRASTRUCTURE NUVOLA EC2 | Assign backend dns route53: command: create zone: "{{ domain_tld }}" record: "nuvola-{{ nuvola_env }}-backend-{{ item.0 }}. {{ domain_tld }}" type: A value: '{{ item.1.public_ip }}' overwrite: yes ttl: "{{ ttl_expire }}" with_indexed_items: '{{ ec2_backend.instances }}' nuvola-prod-backend-3.ops.madisoft.it http://docs.ansible.com/ansible/route53_module.html
  • 32. DNS: local infrastructure_nuvola_ec2.yml - name: INFRASTRUCTURE NUVOLA EC2 | Assign database local dns route53: command: create zone: "{{ domain_tld }}" record: "local-{{ nuvola_env }}-database-{{ item.0 }}. {{ domain_tld }}" type: A value: '{{ item.1.private_ip }}' overwrite: yes with_indexed_items: '{{ ec2_database.instances }}' local-dev-database-14.ops.madisoft.it http://docs.ansible.com/ansible/route53_module.html
  • 33. DNS: local infrastructure_nuvola_ec2.yml - name: INFRASTRUCTURE NUVOLA EC2 | Assign database local dns route53: command: create zone: "{{ domain_tld }}" record: "local-{{ nuvola_env }}-database-{{ item.0 }}. {{ domain_tld }}" type: A value: '{{ item.1.private_ip }}' overwrite: yes with_indexed_items: '{{ ec2_database.instances }}' local-dev-database-14.ops.madisoft.it http://docs.ansible.com/ansible/route53_module.html
  • 35. Warm up Moving: - static files from a shared NAS to S3 - external standalone services to ec2 - Jenkins CI to AWS - ELK stack to AWS - (and testing) Nuvola stage environment
  • 36. Switch of - Stop current app - Create prod env infrastructure - App deployment - Copy db data
  • 37. Infrastructure ./infrastructure_nuvola_env_aws.sh --env prod #!/bin/bash . libs/limit_option_parser.sh …. ansible-playbook --vault-password-file secrets/infrastructure_nuvola_env.secret ansible/infrastucture_nuvola_env.yml -e"$EXTRA_OPTIONS" ….
  • 39. Db data migration Many small databases on diferent machines Use of parallelization Mysql_migrate_dbserver.sh …. ansible-playbook -l $LIMIT ansible/mysql_migrate_dbserver.yml -e "nuvola_env=$ENV" --vault-password-file ./secrets/provision_nuvola_dbserver.secret ….
  • 43. WE ARE HIRING!(wanna join? ask us at the end of the talk or visit our website)