SlideShare a Scribd company logo
ANSIBLE-PROJECT-DEPLOY
a re-usable Ansible role to deploy projects
ABOUT ME
2
Ramon de la Fuente
Future500 B.V.
@f_u_e_n_t_e
SweetlakePHP
WHY ANSIBLE?
• Easy. Period.
3
“I wrote Ansible because none of the existing tools fit my brain.”
- Michael de Haan
WHY ANSIBLE?
• Easy. Period.
• No unnecessary complexity → No agent!
4
WHY ANSIBLE?
• Easy. Period.
• No unnecessary complexity → No agent!
• Built for re-use and sharing.
5
WHY ANSIBLE?
• Easy. Period.
• No unnecessary complexity → No agent!
• Built for re-use and sharing.
• Extendable in your own language.
6
THE PROBLEM
• Continuous deployment
7
THE PROBLEM
• Continuous deployment
• Easy maintenance of the deploy procedure.
8
THE PROBLEM
• Continuous deployment
• Easy maintenance of the deploy procedure.
• Small learning curve.
9
THE PROBLEM
• Continuous deployment
• Easy maintenance of the deploy procedure.
• Small learning curve.
• Reuse between projects with little effort.
10
WHAT IS A DEPLOY?
Directory structure:
.
!"" releases
| !"" 20140415234508
| #"" 20140415235146
!"" shared
| !"" sessions
| !"" source
| #"" uploads
#"" current -> releases/20140415235146
11
WHAT IS A DEPLOY?
Directory structure:
.
!"" releases
| !"" 20140415234508
| #"" 20140415235146
!"" shared
| !"" sessions
| !"" source
| #"" uploads
#"" current -> releases/20140415235146
12
WHAT IS A DEPLOY?
1. Update the codebase + configuration
13
WHAT IS A DEPLOY?
1. Update the codebase + configuration
2. Install dependencies
14
WHAT IS A DEPLOY?
1. Update the codebase + configuration
2. Install dependencies
3. Preserve shared resources
15
WHAT IS A DEPLOY?
1. Update the codebase + configuration
2. Install dependencies
3. Preserve shared resources
4. Build tasks
16
WHAT IS A DEPLOY?
1. Update the codebase + configuration
2. Install dependencies
3. Preserve shared resources
4. Build tasks
5. Finalize
17
THE ROLE
18
https://galaxy.ansible.com/list#/roles/732
project_deploy
GETTINGTHE ROLE
Installation with ansible-galaxy command:
$ ansible-galaxy install f500.project_deploy,v2.1.0
Optional: create a galaxy file for all roles:
f500.nginx
f500.mariadb55
f500.php
f500.project_deploy,v2.1.0
$ ansible-galaxy install -r ansible/galaxy.txt
19
ROLE WALKTHROUGH
---
- name: Initialize
deploy_helper: "path={{ project_root }} state=present"
20
ROLE WALKTHROUGH
Deploy module variables:
deploy_helper:
project_path
current_path
releases_path
shared_path
previous_release
previous_release_path
new_release
new_release_path
unfinished_filename
21
ROLE WALKTHROUGH
Deploy module variables:
deploy_helper:
project_path: /path/to/project/
current_path: /path/to/project/current
releases_path: /path/to/project/releases
shared_path: /path/to/project/shared
previous_release: 20140415234508
previous_release_path: /path/to/project/releases/20140415234508
new_release: 20140415235146
new_release_path: /path/to/project/releases/20140415235146
unfinished_filename: DEPLOY_UNFINISHED
Used as:
{{ deploy_helper.new_release }}
22
1. UPDATETHE CODEBASE
- name: Clone project files
git: repo={{ project_git_repo }}
dest={{ project_source_path }}
version={{ project_version }}
when: project_deploy_strategy == 'git'
- name: Rsync project files
synchronize: src={{ project_local_path }}
dest={{ project_source_path }}
rsync_timeout={{ project_deploy_synchronize_timeout }}
recursive=yes
when: project_deploy_strategy == 'synchronize'
23
1. UPDATETHE CODEBASE
- name: Clone project files
git: repo={{ project_git_repo }}
dest={{ project_source_path }}
version={{ project_version }}
when: project_deploy_strategy == 'git'
- name: Rsync project files
synchronize: src={{ project_local_path }}
dest={{ project_source_path }}
rsync_timeout={{ project_deploy_synchronize_timeout }}
recursive=yes
when: project_deploy_strategy == 'synchronize'
24
1. UPDATETHE CODEBASE
- name: Clone project files
git: repo={{ project_git_repo }}
dest={{ project_source_path }}
version={{ project_version }}
when: project_deploy_strategy == 'git'
- name: Rsync project files
synchronize: src={{ project_local_path }}
dest={{ project_source_path }}
rsync_timeout={{ project_deploy_synchronize_timeout }}
recursive=yes
when: project_deploy_strategy == 'synchronize'
25
1. UPDATETHE CODEBASE
- name: Write unfinished file
file: path={{ project_source_path }}/{{ deploy_helper.unfinished_filename }}
state=touch
- name: Copy files to new build dir
command: "cp -pr {{project_source_path}} {{deploy_helper.new_release_path}}"
- name: Remove unwanted files/folders from new release
file: path={{ deploy_helper.new_release_path }}/{{ item }} state=absent
with_items: project_unwanted_items
26
1. UPDATETHE CONFIG FILES
- name: Copy project files
copy: src={{ item.src }}
dest={{ deploy_helper.new_release_path }}/{{ item.dest }}
mode={{ item.mode|default('0644') }}
with_items: project_files
- name: Copy project templates
template: src={{ item.src }}
dest={{ deploy_helper.new_release_path }}/{{ item.dest }}
mode={{ item.mode|default('0644') }}
with_items: project_templates
27
2. INSTALL DEPENDENCIES
- name: Do composer install
command: "{{ project_command_for_composer_install }} chdir=…"
environment: project_environment
when: project_has_composer
- name: Do npm install
command: "{{ project_command_for_npm_install }} chdir=…"
environment: project_environment
when: project_has_npm
- name: Do bower install
command: "{{ project_command_for_bower_install }} chdir=…"
environment: project_environment
when: project_has_bower
28
2. INSTALL DEPENDENCIES
- name: Do composer install
command: "{{ project_command_for_composer_install }} chdir=…"
environment: project_environment
when: project_has_composer
- name: Do npm install
command: "{{ project_command_for_npm_install }} chdir=…"
environment: project_environment
when: project_has_npm
- name: Do bower install
command: "{{ project_command_for_bower_install }} chdir=…"
environment: project_environment
when: project_has_bower
29
3. SHARED RESOURCES
- name: Ensure shared sources are present
file: path='{{ deploy_helper.shared_path }}/{{ item.src }}'
state={{ item.type }}
with_items: project_shared_children
- name: Ensure shared paths are absent
file: path='{{ deploy_helper.new_release_path }}/{{ item.path }}'
state=absent
with_items: project_shared_children
- name: Create shared symlinks
file: path='{{ deploy_helper.new_release_path }}/{{ item.path }}'
src='{{ deploy_helper.shared_path }}/{{ item.src }}'
state=link"
with_items: project_shared_children
30
4. BUILD STEPS
- name: Run post_build_commands in the new_release_path
command: "{{ item }} chdir={{ deploy_helper.new_release_path }}"
with_items: project_post_build_commands
environment: project_environment
31
project_post_build_commands:
- "app/console cache:clear"
- "app/console assets:install"
- "app/console assetic:dump"
5. FINALIZE
- name: Finalize the deploy

deploy_helper: path={{ project_root }}
release={{ deploy_helper.new_release }}
state=finalize

when: project_finalize

32
33
IT’S NOT COMPLICATED!
• Only 98 lines
• Number of tasks: 22
• Variables to configure: 28
34
MINIMAL PLAYBOOK
1. Set minimum variables
2. Add the role to “roles” section
35
MINIMAL PLAYBOOK
- name: Deploy the application
hosts: production
remote_user: deploy
sudo: no
vars:
project_root: /var/www/my_project
project_git_repo: git@github.com:me/my_project.git
project_deploy_strategy: git
roles:
- f500.project_deploy
36
EXAMPLE PLAYBOOK
- name: Deploy the application
hosts: production
remote_user: "{{ production_deploy_user }}"
sudo: no
vars:
project_root: "{{ sweetlakephp_root }}"
project_git_repo: "{{ sweetlakephp_github_repo }}"
project_deploy_strategy: git
37
EXAMPLE PLAYBOOK
- name: Deploy the application
hosts: production
remote_user: "{{ production_deploy_user }}"
sudo: no
vars:
project_root: "{{ sweetlakephp_root }}"
project_git_repo: "{{ sweetlakephp_github_repo }}"
project_deploy_strategy: git
project_environment:
SYMFONY_ENV: "prod"
38
EXAMPLE PLAYBOOK
project_environment:
SYMFONY_ENV: "prod"
project_shared_children:
- path: "/app/sessions"
src: "sessions"
- path: "/web/uploads"
src: "uploads"
project_templates:
- name: parameters.yml
src: "templates/parameters_prod.yml.j2"
dest: "/app/config/parameters_prod.yml"
39
EXAMPLE PLAYBOOK
project_environment:
SYMFONY_ENV: "prod"
project_shared_children:
- path: "/app/sessions"
src: "sessions"
- path: "/web/uploads"
src: "uploads"
project_templates:
- name: parameters.yml
src: "templates/parameters_prod.yml.j2"
dest: "/app/config/parameters.yml"
40
EXAMPLE PLAYBOOK
project_has_composer: yes
project_post_build_commands:
- "php vendor/sensio/…/DistributionBundle/…/bin/build_bootstrap.php”
- "app/console cache:clear"
- "app/console doctrine:migrations:migrate --no-interaction"
- "app/console assets:install"
- "app/console assetic:dump"
roles:
- f500.project_deploy
41
EXAMPLE PLAYBOOK
project_has_composer: yes
project_post_build_commands:
- "php vendor/sensio/…/DistributionBundle/…/bin/build_bootstrap.php”
- "app/console cache:clear"
- "app/console doctrine:migrations:migrate --no-interaction"
- "app/console assets:install"
- "app/console assetic:dump"
roles:
- f500.project_deploy
42
EXAMPLE PLAYBOOK
43
project_has_composer: yes
project_post_build_commands:
- "php vendor/sensio/…/DistributionBundle/…/bin/build_bootstrap.php”
- "app/console cache:clear"
- "app/console doctrine:migrations:migrate --no-interaction"
- "app/console assets:install"
- "app/console assetic:dump"
roles:
- f500.project_deploy
WHAT DOESN’T IT DO?
44
• Rollbacks (the cake rollback is a lie)
WHAT DOESN’T IT DO?
45
• Rollbacks
• Set maintenance mode
(the cake rollback is a lie)
WHAT DOESN’T IT DO?
46
• Rollbacks
• Set maintenance mode
• DB migrations
(the cake rollback is a lie)
WHAT’S NEXT?
47
• Injecting your own tasks in addition to commands
WHAT’S NEXT?
48
• Injecting your own tasks in addition to commands
• Copy vendor folders from previous release ✓
WHAT’S NEXT?
49
• Injecting your own tasks in addition to commands
• Copy vendor folders from previous release
• Setfacl support
✓
WHAT’S NEXT?
50
• Injecting your own tasks in addition to commands
• Copy vendor folders from previous release
• Setfacl support
• Your ideas?
✓
THANKYOU!
51
Feedback: joind.in 13405
f500/ansible-project_deploy
(But I’m also just a human. You could talk to me and tell me what you think…)
https://github.com/

More Related Content

PDF
Ansible project-deploy
PDF
Ansible project-deploy (NomadPHP lightning talk)
PDF
Building a Drupal site with Git
PDF
Composer tools and frameworks for drupal.ppt
PPTX
Virtual Bolt Workshop - 6 May
PPTX
Composer JSON kills make files
PPT
Build Automation of PHP Applications
PDF
Practical PHP Deployment with Jenkins
Ansible project-deploy
Ansible project-deploy (NomadPHP lightning talk)
Building a Drupal site with Git
Composer tools and frameworks for drupal.ppt
Virtual Bolt Workshop - 6 May
Composer JSON kills make files
Build Automation of PHP Applications
Practical PHP Deployment with Jenkins

What's hot (20)

PPTX
Getting Started With Aura
PPTX
Laravel Beginners Tutorial 1
PDF
IBM Drupal Users Group Discussion on Managing and Deploying Configuration
PDF
CI : the first_step: Auto Testing with CircleCI - (MOSG)
PDF
Writing a Jenkins / Hudson plugin
PDF
Play framework 2 : Peter Hilton
KEY
Ant vs Phing
PDF
Building and deploying PHP applications with Phing
PDF
Dockerize All The Things
PDF
Development Setup of B-Translator
PDF
Using Drupal Features in B-Translator
PDF
Deploying PHP applications with Phing
PDF
Development Workflow Tools for Open-Source PHP Libraries
PDF
Jenkins Shared Libraries
PDF
Lean Drupal Repositories with Composer and Drush
PDF
Phing
PDF
Building and Deploying PHP Apps Using phing
PDF
Using Composer with Drupal and Drush
PDF
11 tools for your PHP devops stack
PDF
Deploying Symfony | symfony.cat
Getting Started With Aura
Laravel Beginners Tutorial 1
IBM Drupal Users Group Discussion on Managing and Deploying Configuration
CI : the first_step: Auto Testing with CircleCI - (MOSG)
Writing a Jenkins / Hudson plugin
Play framework 2 : Peter Hilton
Ant vs Phing
Building and deploying PHP applications with Phing
Dockerize All The Things
Development Setup of B-Translator
Using Drupal Features in B-Translator
Deploying PHP applications with Phing
Development Workflow Tools for Open-Source PHP Libraries
Jenkins Shared Libraries
Lean Drupal Repositories with Composer and Drush
Phing
Building and Deploying PHP Apps Using phing
Using Composer with Drupal and Drush
11 tools for your PHP devops stack
Deploying Symfony | symfony.cat
Ad

Viewers also liked (20)

PPTX
El comportamiento de los consumidores panameños
PPT
Cuestionario en la investigación
PPTX
Comportamiento de compra del consumidor
PDF
Comportamiento de compra del consumidor
PPTX
Presentación adm
PDF
Universidad de panama
PPTX
Ecommerce comportamiento del consumidor
PPT
Expectativas de Panamá frente a la crisis financiera y económica mundial
PPT
Comportamiento al consumidor
PPTX
Comportamiento de compra del consumidor
PPT
Mediciones enero 2011 - Índice de confianza de los consumidores panameños mar...
PPTX
Comportamiento del consumidor
PDF
Balance Económico de Panamá 2015 y Perspectivas 2016 - Foro de Capital Financ...
PDF
Balance Económico de Panamá del 2015 y Perspectiva del 2016
PDF
Comportamiento del consumidor (20 sesiones)
PPTX
Capital structure
PDF
PPTX
Выбор подрядчиков для интернет рекламы и продвижения
PDF
Pp 101 tahun_2000
El comportamiento de los consumidores panameños
Cuestionario en la investigación
Comportamiento de compra del consumidor
Comportamiento de compra del consumidor
Presentación adm
Universidad de panama
Ecommerce comportamiento del consumidor
Expectativas de Panamá frente a la crisis financiera y económica mundial
Comportamiento al consumidor
Comportamiento de compra del consumidor
Mediciones enero 2011 - Índice de confianza de los consumidores panameños mar...
Comportamiento del consumidor
Balance Económico de Panamá 2015 y Perspectivas 2016 - Foro de Capital Financ...
Balance Económico de Panamá del 2015 y Perspectiva del 2016
Comportamiento del consumidor (20 sesiones)
Capital structure
Выбор подрядчиков для интернет рекламы и продвижения
Pp 101 tahun_2000
Ad

Similar to Ansible Project Deploy (phpbenelux 2015) (20)

PPTX
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
PDF
Dockercon EU 2014
PDF
Jenkins Pipelines
PDF
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins Pipelines
PDF
(Declarative) Jenkins Pipelines
PDF
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
PPTX
Job DSL Plugin for Jenkins
PPTX
(Re)-Introduction to Maven
KEY
Practical introduction to dev ops with chef
PDF
Continuous Integration and DevOps with Open Build Service(OBS)
PDF
Docker 102 - Immutable Infrastructure
PPT
An introduction to maven gradle and sbt
PDF
Using Prometheus to monitor your build pipelines
PPTX
Automate DBA Tasks With Ansible
PDF
Knative build for open whisk runtimes phase 1 - 2018-02-20
PDF
Python Programming for ArcGIS: Part I
PPTX
ASP.NET 5 auf Raspberry PI & docker
PPTX
SymfonyCon Berlin 2016 Jenkins Deployment Pipelines
PDF
Ruby on Rails - Introduction
PPTX
habitat at docker bud
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
Dockercon EU 2014
Jenkins Pipelines
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins Pipelines
(Declarative) Jenkins Pipelines
MobileConf 2021 Slides: Let's build macOS CLI Utilities using Swift
Job DSL Plugin for Jenkins
(Re)-Introduction to Maven
Practical introduction to dev ops with chef
Continuous Integration and DevOps with Open Build Service(OBS)
Docker 102 - Immutable Infrastructure
An introduction to maven gradle and sbt
Using Prometheus to monitor your build pipelines
Automate DBA Tasks With Ansible
Knative build for open whisk runtimes phase 1 - 2018-02-20
Python Programming for ArcGIS: Part I
ASP.NET 5 auf Raspberry PI & docker
SymfonyCon Berlin 2016 Jenkins Deployment Pipelines
Ruby on Rails - Introduction
habitat at docker bud

Recently uploaded (20)

PPTX
Internet___Basics___Styled_ presentation
PPTX
Introduction about ICD -10 and ICD11 on 5.8.25.pptx
PDF
💰 𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓 💰
PPTX
Funds Management Learning Material for Beg
PDF
Triggering QUIC, presented by Geoff Huston at IETF 123
PDF
Slides PDF The World Game (s) Eco Economic Epochs.pdf
PPTX
presentation_pfe-universite-molay-seltan.pptx
PPTX
introduction about ICD -10 & ICD-11 ppt.pptx
PDF
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
PDF
Testing WebRTC applications at scale.pdf
PPTX
Digital Literacy And Online Safety on internet
PDF
RPKI Status Update, presented by Makito Lay at IDNOG 10
PPTX
Introduction to Information and Communication Technology
PPTX
QR Codes Qr codecodecodecodecocodedecodecode
PDF
The New Creative Director: How AI Tools for Social Media Content Creation Are...
PPTX
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
PDF
Cloud-Scale Log Monitoring _ Datadog.pdf
PDF
WebRTC in SignalWire - troubleshooting media negotiation
PPTX
SAP Ariba Sourcing PPT for learning material
PDF
Vigrab.top – Online Tool for Downloading and Converting Social Media Videos a...
Internet___Basics___Styled_ presentation
Introduction about ICD -10 and ICD11 on 5.8.25.pptx
💰 𝐔𝐊𝐓𝐈 𝐊𝐄𝐌𝐄𝐍𝐀𝐍𝐆𝐀𝐍 𝐊𝐈𝐏𝐄𝐑𝟒𝐃 𝐇𝐀𝐑𝐈 𝐈𝐍𝐈 𝟐𝟎𝟐𝟓 💰
Funds Management Learning Material for Beg
Triggering QUIC, presented by Geoff Huston at IETF 123
Slides PDF The World Game (s) Eco Economic Epochs.pdf
presentation_pfe-universite-molay-seltan.pptx
introduction about ICD -10 & ICD-11 ppt.pptx
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
Testing WebRTC applications at scale.pdf
Digital Literacy And Online Safety on internet
RPKI Status Update, presented by Makito Lay at IDNOG 10
Introduction to Information and Communication Technology
QR Codes Qr codecodecodecodecocodedecodecode
The New Creative Director: How AI Tools for Social Media Content Creation Are...
June-4-Sermon-Powerpoint.pptx USE THIS FOR YOUR MOTIVATION
Cloud-Scale Log Monitoring _ Datadog.pdf
WebRTC in SignalWire - troubleshooting media negotiation
SAP Ariba Sourcing PPT for learning material
Vigrab.top – Online Tool for Downloading and Converting Social Media Videos a...

Ansible Project Deploy (phpbenelux 2015)

  • 2. ABOUT ME 2 Ramon de la Fuente Future500 B.V. @f_u_e_n_t_e SweetlakePHP
  • 3. WHY ANSIBLE? • Easy. Period. 3 “I wrote Ansible because none of the existing tools fit my brain.” - Michael de Haan
  • 4. WHY ANSIBLE? • Easy. Period. • No unnecessary complexity → No agent! 4
  • 5. WHY ANSIBLE? • Easy. Period. • No unnecessary complexity → No agent! • Built for re-use and sharing. 5
  • 6. WHY ANSIBLE? • Easy. Period. • No unnecessary complexity → No agent! • Built for re-use and sharing. • Extendable in your own language. 6
  • 8. THE PROBLEM • Continuous deployment • Easy maintenance of the deploy procedure. 8
  • 9. THE PROBLEM • Continuous deployment • Easy maintenance of the deploy procedure. • Small learning curve. 9
  • 10. THE PROBLEM • Continuous deployment • Easy maintenance of the deploy procedure. • Small learning curve. • Reuse between projects with little effort. 10
  • 11. WHAT IS A DEPLOY? Directory structure: . !"" releases | !"" 20140415234508 | #"" 20140415235146 !"" shared | !"" sessions | !"" source | #"" uploads #"" current -> releases/20140415235146 11
  • 12. WHAT IS A DEPLOY? Directory structure: . !"" releases | !"" 20140415234508 | #"" 20140415235146 !"" shared | !"" sessions | !"" source | #"" uploads #"" current -> releases/20140415235146 12
  • 13. WHAT IS A DEPLOY? 1. Update the codebase + configuration 13
  • 14. WHAT IS A DEPLOY? 1. Update the codebase + configuration 2. Install dependencies 14
  • 15. WHAT IS A DEPLOY? 1. Update the codebase + configuration 2. Install dependencies 3. Preserve shared resources 15
  • 16. WHAT IS A DEPLOY? 1. Update the codebase + configuration 2. Install dependencies 3. Preserve shared resources 4. Build tasks 16
  • 17. WHAT IS A DEPLOY? 1. Update the codebase + configuration 2. Install dependencies 3. Preserve shared resources 4. Build tasks 5. Finalize 17
  • 19. GETTINGTHE ROLE Installation with ansible-galaxy command: $ ansible-galaxy install f500.project_deploy,v2.1.0 Optional: create a galaxy file for all roles: f500.nginx f500.mariadb55 f500.php f500.project_deploy,v2.1.0 $ ansible-galaxy install -r ansible/galaxy.txt 19
  • 20. ROLE WALKTHROUGH --- - name: Initialize deploy_helper: "path={{ project_root }} state=present" 20
  • 21. ROLE WALKTHROUGH Deploy module variables: deploy_helper: project_path current_path releases_path shared_path previous_release previous_release_path new_release new_release_path unfinished_filename 21
  • 22. ROLE WALKTHROUGH Deploy module variables: deploy_helper: project_path: /path/to/project/ current_path: /path/to/project/current releases_path: /path/to/project/releases shared_path: /path/to/project/shared previous_release: 20140415234508 previous_release_path: /path/to/project/releases/20140415234508 new_release: 20140415235146 new_release_path: /path/to/project/releases/20140415235146 unfinished_filename: DEPLOY_UNFINISHED Used as: {{ deploy_helper.new_release }} 22
  • 23. 1. UPDATETHE CODEBASE - name: Clone project files git: repo={{ project_git_repo }} dest={{ project_source_path }} version={{ project_version }} when: project_deploy_strategy == 'git' - name: Rsync project files synchronize: src={{ project_local_path }} dest={{ project_source_path }} rsync_timeout={{ project_deploy_synchronize_timeout }} recursive=yes when: project_deploy_strategy == 'synchronize' 23
  • 24. 1. UPDATETHE CODEBASE - name: Clone project files git: repo={{ project_git_repo }} dest={{ project_source_path }} version={{ project_version }} when: project_deploy_strategy == 'git' - name: Rsync project files synchronize: src={{ project_local_path }} dest={{ project_source_path }} rsync_timeout={{ project_deploy_synchronize_timeout }} recursive=yes when: project_deploy_strategy == 'synchronize' 24
  • 25. 1. UPDATETHE CODEBASE - name: Clone project files git: repo={{ project_git_repo }} dest={{ project_source_path }} version={{ project_version }} when: project_deploy_strategy == 'git' - name: Rsync project files synchronize: src={{ project_local_path }} dest={{ project_source_path }} rsync_timeout={{ project_deploy_synchronize_timeout }} recursive=yes when: project_deploy_strategy == 'synchronize' 25
  • 26. 1. UPDATETHE CODEBASE - name: Write unfinished file file: path={{ project_source_path }}/{{ deploy_helper.unfinished_filename }} state=touch - name: Copy files to new build dir command: "cp -pr {{project_source_path}} {{deploy_helper.new_release_path}}" - name: Remove unwanted files/folders from new release file: path={{ deploy_helper.new_release_path }}/{{ item }} state=absent with_items: project_unwanted_items 26
  • 27. 1. UPDATETHE CONFIG FILES - name: Copy project files copy: src={{ item.src }} dest={{ deploy_helper.new_release_path }}/{{ item.dest }} mode={{ item.mode|default('0644') }} with_items: project_files - name: Copy project templates template: src={{ item.src }} dest={{ deploy_helper.new_release_path }}/{{ item.dest }} mode={{ item.mode|default('0644') }} with_items: project_templates 27
  • 28. 2. INSTALL DEPENDENCIES - name: Do composer install command: "{{ project_command_for_composer_install }} chdir=…" environment: project_environment when: project_has_composer - name: Do npm install command: "{{ project_command_for_npm_install }} chdir=…" environment: project_environment when: project_has_npm - name: Do bower install command: "{{ project_command_for_bower_install }} chdir=…" environment: project_environment when: project_has_bower 28
  • 29. 2. INSTALL DEPENDENCIES - name: Do composer install command: "{{ project_command_for_composer_install }} chdir=…" environment: project_environment when: project_has_composer - name: Do npm install command: "{{ project_command_for_npm_install }} chdir=…" environment: project_environment when: project_has_npm - name: Do bower install command: "{{ project_command_for_bower_install }} chdir=…" environment: project_environment when: project_has_bower 29
  • 30. 3. SHARED RESOURCES - name: Ensure shared sources are present file: path='{{ deploy_helper.shared_path }}/{{ item.src }}' state={{ item.type }} with_items: project_shared_children - name: Ensure shared paths are absent file: path='{{ deploy_helper.new_release_path }}/{{ item.path }}' state=absent with_items: project_shared_children - name: Create shared symlinks file: path='{{ deploy_helper.new_release_path }}/{{ item.path }}' src='{{ deploy_helper.shared_path }}/{{ item.src }}' state=link" with_items: project_shared_children 30
  • 31. 4. BUILD STEPS - name: Run post_build_commands in the new_release_path command: "{{ item }} chdir={{ deploy_helper.new_release_path }}" with_items: project_post_build_commands environment: project_environment 31 project_post_build_commands: - "app/console cache:clear" - "app/console assets:install" - "app/console assetic:dump"
  • 32. 5. FINALIZE - name: Finalize the deploy
 deploy_helper: path={{ project_root }} release={{ deploy_helper.new_release }} state=finalize
 when: project_finalize
 32
  • 33. 33
  • 34. IT’S NOT COMPLICATED! • Only 98 lines • Number of tasks: 22 • Variables to configure: 28 34
  • 35. MINIMAL PLAYBOOK 1. Set minimum variables 2. Add the role to “roles” section 35
  • 36. MINIMAL PLAYBOOK - name: Deploy the application hosts: production remote_user: deploy sudo: no vars: project_root: /var/www/my_project project_git_repo: git@github.com:me/my_project.git project_deploy_strategy: git roles: - f500.project_deploy 36
  • 37. EXAMPLE PLAYBOOK - name: Deploy the application hosts: production remote_user: "{{ production_deploy_user }}" sudo: no vars: project_root: "{{ sweetlakephp_root }}" project_git_repo: "{{ sweetlakephp_github_repo }}" project_deploy_strategy: git 37
  • 38. EXAMPLE PLAYBOOK - name: Deploy the application hosts: production remote_user: "{{ production_deploy_user }}" sudo: no vars: project_root: "{{ sweetlakephp_root }}" project_git_repo: "{{ sweetlakephp_github_repo }}" project_deploy_strategy: git project_environment: SYMFONY_ENV: "prod" 38
  • 39. EXAMPLE PLAYBOOK project_environment: SYMFONY_ENV: "prod" project_shared_children: - path: "/app/sessions" src: "sessions" - path: "/web/uploads" src: "uploads" project_templates: - name: parameters.yml src: "templates/parameters_prod.yml.j2" dest: "/app/config/parameters_prod.yml" 39
  • 40. EXAMPLE PLAYBOOK project_environment: SYMFONY_ENV: "prod" project_shared_children: - path: "/app/sessions" src: "sessions" - path: "/web/uploads" src: "uploads" project_templates: - name: parameters.yml src: "templates/parameters_prod.yml.j2" dest: "/app/config/parameters.yml" 40
  • 41. EXAMPLE PLAYBOOK project_has_composer: yes project_post_build_commands: - "php vendor/sensio/…/DistributionBundle/…/bin/build_bootstrap.php” - "app/console cache:clear" - "app/console doctrine:migrations:migrate --no-interaction" - "app/console assets:install" - "app/console assetic:dump" roles: - f500.project_deploy 41
  • 42. EXAMPLE PLAYBOOK project_has_composer: yes project_post_build_commands: - "php vendor/sensio/…/DistributionBundle/…/bin/build_bootstrap.php” - "app/console cache:clear" - "app/console doctrine:migrations:migrate --no-interaction" - "app/console assets:install" - "app/console assetic:dump" roles: - f500.project_deploy 42
  • 43. EXAMPLE PLAYBOOK 43 project_has_composer: yes project_post_build_commands: - "php vendor/sensio/…/DistributionBundle/…/bin/build_bootstrap.php” - "app/console cache:clear" - "app/console doctrine:migrations:migrate --no-interaction" - "app/console assets:install" - "app/console assetic:dump" roles: - f500.project_deploy
  • 44. WHAT DOESN’T IT DO? 44 • Rollbacks (the cake rollback is a lie)
  • 45. WHAT DOESN’T IT DO? 45 • Rollbacks • Set maintenance mode (the cake rollback is a lie)
  • 46. WHAT DOESN’T IT DO? 46 • Rollbacks • Set maintenance mode • DB migrations (the cake rollback is a lie)
  • 47. WHAT’S NEXT? 47 • Injecting your own tasks in addition to commands
  • 48. WHAT’S NEXT? 48 • Injecting your own tasks in addition to commands • Copy vendor folders from previous release ✓
  • 49. WHAT’S NEXT? 49 • Injecting your own tasks in addition to commands • Copy vendor folders from previous release • Setfacl support ✓
  • 50. WHAT’S NEXT? 50 • Injecting your own tasks in addition to commands • Copy vendor folders from previous release • Setfacl support • Your ideas? ✓
  • 51. THANKYOU! 51 Feedback: joind.in 13405 f500/ansible-project_deploy (But I’m also just a human. You could talk to me and tell me what you think…) https://github.com/