ansible project deploy (phpbenelux 2015)

51
ANSIBLE-PROJECT-DEPLOY a re-usable Ansible role to deploy projects

Upload: ramon-de-la-fuente

Post on 16-Jul-2015

343 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: Ansible Project Deploy (phpbenelux 2015)

ANSIBLE-PROJECT-DEPLOYa re-usable Ansible role to deploy projects

Page 2: Ansible Project Deploy (phpbenelux 2015)

ABOUT ME

2

Ramon de la Fuente

Future500 B.V.

@f_u_e_n_t_e

SweetlakePHP

Page 3: Ansible Project Deploy (phpbenelux 2015)

WHY ANSIBLE?• Easy. Period.

3

“I wrote Ansible because none of the existing tools fit my brain.”

- Michael de Haan

Page 4: Ansible Project Deploy (phpbenelux 2015)

WHY ANSIBLE?• Easy. Period.

• No unnecessary complexity → No agent!

4

Page 5: Ansible Project Deploy (phpbenelux 2015)

WHY ANSIBLE?• Easy. Period.

• No unnecessary complexity → No agent!

• Built for re-use and sharing.

5

Page 6: Ansible Project Deploy (phpbenelux 2015)

WHY ANSIBLE?• Easy. Period.

• No unnecessary complexity → No agent!

• Built for re-use and sharing.

• Extendable in your own language.

6

Page 7: Ansible Project Deploy (phpbenelux 2015)

THE PROBLEM• Continuous deployment

7

Page 8: Ansible Project Deploy (phpbenelux 2015)

THE PROBLEM• Continuous deployment

• Easy maintenance of the deploy procedure.

8

Page 9: Ansible Project Deploy (phpbenelux 2015)

THE PROBLEM• Continuous deployment

• Easy maintenance of the deploy procedure.

• Small learning curve.

9

Page 10: Ansible Project Deploy (phpbenelux 2015)

THE PROBLEM• Continuous deployment

• Easy maintenance of the deploy procedure.

• Small learning curve.

• Reuse between projects with little effort.

10

Page 11: Ansible Project Deploy (phpbenelux 2015)

WHAT IS A DEPLOY?Directory structure:

.

!"" releases | !"" 20140415234508 | #"" 20140415235146 !"" shared | !"" sessions | !"" source | #"" uploads #"" current -> releases/20140415235146

11

Page 12: Ansible Project Deploy (phpbenelux 2015)

WHAT IS A DEPLOY?Directory structure:

.

!"" releases | !"" 20140415234508 | #"" 20140415235146 !"" shared | !"" sessions | !"" source | #"" uploads #"" current -> releases/20140415235146

12

Page 13: Ansible Project Deploy (phpbenelux 2015)

WHAT IS A DEPLOY?1. Update the codebase + configuration

13

Page 14: Ansible Project Deploy (phpbenelux 2015)

WHAT IS A DEPLOY?1. Update the codebase + configuration

2. Install dependencies

14

Page 15: Ansible Project Deploy (phpbenelux 2015)

WHAT IS A DEPLOY?1. Update the codebase + configuration

2. Install dependencies

3. Preserve shared resources

15

Page 16: Ansible Project Deploy (phpbenelux 2015)

WHAT IS A DEPLOY?1. Update the codebase + configuration

2. Install dependencies

3. Preserve shared resources

4. Build tasks

16

Page 17: Ansible Project Deploy (phpbenelux 2015)

WHAT IS A DEPLOY?1. Update the codebase + configuration

2. Install dependencies

3. Preserve shared resources

4. Build tasks

5. Finalize

17

Page 18: Ansible Project Deploy (phpbenelux 2015)

THE ROLE

18

https://galaxy.ansible.com/list#/roles/732project_deploy

Page 19: Ansible Project Deploy (phpbenelux 2015)

GETTING THE ROLEInstallation 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

Page 20: Ansible Project Deploy (phpbenelux 2015)

ROLE WALKTHROUGH---

- name: Initialize

deploy_helper: "path={{ project_root }} state=present"

20

Page 21: Ansible Project Deploy (phpbenelux 2015)

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

Page 22: Ansible Project Deploy (phpbenelux 2015)

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

Page 23: Ansible Project Deploy (phpbenelux 2015)

1. UPDATE THE 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

Page 24: Ansible Project Deploy (phpbenelux 2015)

1. UPDATE THE 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

Page 25: Ansible Project Deploy (phpbenelux 2015)

1. UPDATE THE 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

Page 26: Ansible Project Deploy (phpbenelux 2015)

1. UPDATE THE 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

Page 27: Ansible Project Deploy (phpbenelux 2015)

1. UPDATE THE 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

Page 28: Ansible Project Deploy (phpbenelux 2015)

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

Page 29: Ansible Project Deploy (phpbenelux 2015)

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

Page 30: Ansible Project Deploy (phpbenelux 2015)

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

Page 31: Ansible Project Deploy (phpbenelux 2015)

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"

Page 32: Ansible Project Deploy (phpbenelux 2015)

5. FINALIZE- name: Finalize the deploy deploy_helper: path={{ project_root }}

release={{ deploy_helper.new_release }}

state=finalize when: project_finalize

32

Page 33: Ansible Project Deploy (phpbenelux 2015)

33

Page 34: Ansible Project Deploy (phpbenelux 2015)

IT’S NOT COMPLICATED!• Only 98 lines

• Number of tasks: 22

• Variables to configure: 28

34

Page 35: Ansible Project Deploy (phpbenelux 2015)

MINIMAL PLAYBOOK

1. Set minimum variables

2. Add the role to “roles” section

35

Page 36: Ansible Project Deploy (phpbenelux 2015)

MINIMAL PLAYBOOK- name: Deploy the application

hosts: production

remote_user: deploy

sudo: no

vars:

project_root: /var/www/my_project

project_git_repo: [email protected]:me/my_project.git

project_deploy_strategy: git

roles:

- f500.project_deploy

36

Page 37: Ansible Project Deploy (phpbenelux 2015)

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

Page 38: Ansible Project Deploy (phpbenelux 2015)

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

Page 39: Ansible Project Deploy (phpbenelux 2015)

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

Page 40: Ansible Project Deploy (phpbenelux 2015)

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

Page 41: Ansible Project Deploy (phpbenelux 2015)

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

Page 42: Ansible Project Deploy (phpbenelux 2015)

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

Page 43: Ansible Project Deploy (phpbenelux 2015)

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

Page 44: Ansible Project Deploy (phpbenelux 2015)

WHAT DOESN’T IT DO?

44

• Rollbacks (the cake rollback is a lie)

Page 45: Ansible Project Deploy (phpbenelux 2015)

WHAT DOESN’T IT DO?

45

• Rollbacks

• Set maintenance mode

(the cake rollback is a lie)

Page 46: Ansible Project Deploy (phpbenelux 2015)

WHAT DOESN’T IT DO?

46

• Rollbacks

• Set maintenance mode

• DB migrations

(the cake rollback is a lie)

Page 47: Ansible Project Deploy (phpbenelux 2015)

WHAT’S NEXT?

47

• Injecting your own tasks in addition to commands

Page 48: Ansible Project Deploy (phpbenelux 2015)

WHAT’S NEXT?

48

• Injecting your own tasks in addition to commands

• Copy vendor folders from previous release ✓

Page 49: Ansible Project Deploy (phpbenelux 2015)

WHAT’S NEXT?

49

• Injecting your own tasks in addition to commands

• Copy vendor folders from previous release

• Setfacl support

Page 50: Ansible Project Deploy (phpbenelux 2015)

WHAT’S NEXT?

50

• Injecting your own tasks in addition to commands

• Copy vendor folders from previous release

• Setfacl support

• Your ideas?

Page 51: Ansible Project Deploy (phpbenelux 2015)

THANK YOU!

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/