ansistrano.deploy
Ansistrano
ansistrano.deploy i ansistrano.rollback to role Ansible, które ułatwiają zarządzanie procesem wdrażania aplikacji skryptowych, takich jak PHP, Python i Ruby. To jest port Ansible dla Capistrano.
- Ansistrano
- Historia
- Nazwa projektu
- Anonimowe statystyki użycia Ansistrano
- Kto używa Ansistrano?
- Wymagania
- Instalacja
- Aktualizacja
- Funkcje
- Główny proces roboczy
- Zmienne roli
- Wdrażanie
- Cofanie zmian
- Hooki: Niestandardowe zadania
- Zmienne w niestandardowych zadaniach
- Przycinanie starych wydań
- Przykładowy playbook
- Przykładowe projekty
- Mówią o nas
- Licencja
- Inne źródła
Historia
Capistrano to narzędzie do automatyzacji serwerów zdalnych, które jest obecnie w wersji 3. Wersja 2.0 zaprojektowana była głównie do wdrażania aplikacji Ruby on Rails (RoR). Dzięki dodatkowym wtyczkom można było wdrażać aplikacje, które nie są oparte na Rails, takie jak PHP i Python, z różnymi strategami wdrażania, etapami i nie tylko. Bardzo lubiłem Capistrano v2. Używałem go dużo i stworzyłem wtyczkę dla niego.
Capistrano 2 to wspaniałe narzędzie, które nadal działa dobrze. Jednak nie jest już utrzymywane, ponieważ oryginalny zespół pracuje nad wersją 3. Nowa wersja nie ma takich samych funkcji, co czyni ją mniej potężną i elastyczną. Ponadto pojawiają się inne nowe narzędzia, które umożliwiają łatwiejsze wdrażanie aplikacji, takie jak Ansible.
Dlatego postanowiłem zaprzestać korzystania z Capistrano, ponieważ v2 nie jest już utrzymywane, a v3 nie ma wystarczających funkcji. Wszystko, co Capistrano robiło, mogę zrobić za pomocą Ansible. Jeśli szukasz alternatyw, sprawdź Fabric lub Chef Solo.
Nazwa projektu
Ansistrano pochodzi od Ansible + Capistrano, proste, prawda?
Anonimowe statystyki użycia Ansistrano
W Ansistrano istnieje opcjonalny krok, który wysyła zapytanie HTTP do naszych serwerów. Niestety, metryki, które możemy uzyskać z Ansible Galaxy, są ograniczone, więc to jeden z niewielu sposobów, jakie mamy, aby zmierzyć liczbę aktywnych użytkowników.
Używamy tych danych tylko do statystyk użycia, ale jeśli nie czujesz się z tym komfortowo, możesz wyłączyć ten dodatkowy krok, ustawiając ansistrano_allow_anonymous_stats
na false w swoich playbookach.
Kto używa Ansistrano?
Czy Ansistrano jest gotowe do użycia? Oto niektóre firmy, które obecnie go używają:
- ABA English
- Another Place Productions
- Aptvision
- ARTACK WebLab
- Atrápalo
- Beroomers
- CMP Group
- Cabissimo
- Camel Secure
- Cherry Hill
- Claranet Francja
- Clearpoint
- Clever Age
- CridaDemocracia
- Cycloid
- Daemonit
- Deliverea
- DevOps Barcelona Conference
- Durable Programming
- EnAlquiler
- Euromillions.com
- Finizens
- FloraQueen
- Fluxus
- Geocalia
- Gstock
- HackSoft
- HackConf
- Hexanet
- HiringThing
- Holaluz
- Hosting4devs
- Jobbsy
- Jolicode
- Kidfund
- Lumao SAS
- mailXpert
- MEDIA.figaro
- Moss
- Nice&Crazy
- Nodo Ámbar
- Oferplan
- Ofertix
- Òmnium Cultural
- OpsWay Software Factory
- Parkimeter
- PHP Barcelona Conference
- Scoutim
- Socialnk
- Spotahome
- Suntransfers
- TechPump
- Tienda Online VirginMobile
- The Cocktail
- Timehook
- TMTFactory
- UNICEF Comité Español
- Ulabox
- Uvinum
- VirginMobile Chile
- Wavecontrol
- WAVE Meditation
- Yubl
- AmphiBee
- Hexito
Jeśli również go używasz, daj nam znać poprzez PR do tego dokumentu.
Wymagania
Aby wdrożyć swoje aplikacje za pomocą Ansistrano, potrzebujesz:
- Ansible na swojej maszynie do wdrożeń
rsync
na docelowej maszynie, jeśli używasz strategii wdrażaniarsync
,rsync_direct
lubgit
, albo jeśli używaszansistrano_current_via = rsync
Instalacja
Ansistrano to rola Ansible dystrybuowana globalnie za pomocą Ansible Galaxy. Aby zainstalować rolę Ansistrano, użyj następującego polecenia:
$ ansible-galaxy install ansistrano.deploy ansistrano.rollback
Aktualizacja
Jeśli chcesz zaktualizować rolę, musisz przekazać parametr --force podczas instalacji. Sprawdź poniższe polecenie:
$ ansible-galaxy install --force ansistrano.deploy ansistrano.rollback
Funkcje
- Cofanie zmian w kilka sekund (z rolą ansistrano.rollback)
- Dostosuj swoje wdrożenie za pomocą hooków przed i po krytycznych krokach
- Oszczędzaj miejsce na dysku, utrzymując maksymalną liczbę wydań na swoich hostach
- Wybierz między strategią wdrażania SCP, RSYNC, GIT, SVN, HG, HTTP Download lub S3 GET (dodatkowy krok unarchive w zestawie)
Główny proces roboczy
Ansistrano wdraża aplikacje zgodnie z procesem Capistrano.
- Faza konfiguracji: Tworzy strukturę folderów do przechowywania wydań
- Faza aktualizacji kodu: Umieszcza nowe wydanie na hostach
- Faza symlinka: Po wdrożeniu nowego wydania na hostach, ten krok zmienia miękki link
current
na nowe wydanie - Faza czyszczenia: Usuwa stare wersje na podstawie parametru
ansistrano_keep_releases
(zobacz „Zmienne roli”)
Zmienne roli
vars:
ansistrano_deploy_from: "{{ playbook_dir }}/" # Skąd pochodzi moja lokalna aplikacja (ścieżka względna lub absolutna)
ansistrano_deploy_to: "/var/www/my-app" # Domena bazowa do wdrożenia.
ansistrano_version_dir: "releases" # Nazwa folderu wydań
ansistrano_shared_dir: "shared" # Nazwa folderu współdzielonego
ansistrano_current_dir: "current" # Nazwa miękkiego linku. Rzadko powinieneś to zmieniać.
ansistrano_current_via: "symlink" # Strategia wdrażania wskazująca, gdzie kod powinien być wdrażany do aktualnej ścieżki. Opcje to symlink lub rsync
ansistrano_keep_releases: 0 # Liczba wydań do zachowania po nowym wdrożeniu. Zobacz "Przycinanie starych wydań".
# Tablice folderów i plików do współdzielenia.
ansistrano_shared_paths: []
ansistrano_shared_files: []
# Utworzenie folderów współdzielonych i folderów bazowych.
ansistrano_ensure_shared_paths_exist: yes
ansistrano_ensure_basedirs_shared_files_exist: yes
# Strategia wdrażania - metoda używana do dostarczania kodu. Opcje to copy, download, git, rsync, rsync_direct, svn lub s3.
ansistrano_deploy_via: rsync
ansistrano_allow_anonymous_stats: yes
# Zmienne używane w strategii wdrażania rsync/rsync_direct
ansistrano_rsync_extra_params: ""
ansistrano_rsync_set_remote_user: yes
ansistrano_rsync_path: ""
ansistrano_rsync_use_ssh_args: no
# Zmienne używane w strategii wdrażania Git
ansistrano_git_repo: [email protected]:USERNAME/REPO.git
ansistrano_git_branch: master
ansistrano_git_repo_tree: ""
ansistrano_git_identity_key_path: ""
ansistrano_git_identity_key_remote_path: ""
ansistrano_git_identity_key_shred: true
ansistrano_git_refspec: ADDITIONAL_GIT_REFSPEC
ansistrano_git_ssh_opts: "-o StrictHostKeyChecking=no"
ansistrano_git_depth: 1
ansistrano_git_executable: /opt/local/bin/git
# Zmienne używane w strategii wdrażania SVN
ansistrano_svn_repo: https://svn.company.com/project
ansistrano_svn_branch: trunk
ansistrano_svn_revision: HEAD
ansistrano_svn_username: user
ansistrano_svn_password: Pa$$word
ansistrano_svn_environment: {}
# Zmienne używane w strategii wdrażania HG
ansistrano_hg_repo: https://[email protected]/USERNAME/REPO
ansistrano_hg_branch: default
{{ playbook_dir }}
to zmienna Ansible, która zawiera ścieżkę do aktualnego playbooka.
Wdrażanie
Aby wdrożyć z Ansistrano, musisz wykonać kilka kroków:
- Utwórz nowy plik
hosts
. Sprawdź dokumentację inwentarza Ansible, jeśli potrzebujesz pomocy. Ten plik zidentyfikuje wszystkie hosty, na które chcesz wdrożyć. Dla środowisk wielostopniowych sprawdź Środowiska wielostopniowe. - Utwórz nowy playbook do wdrażania swojej aplikacji, na przykład,
deploy.yml
- Skonfiguruj zmienne roli (zobacz Zmienne roli)
- Dołącz rolę
ansistrano.deploy
jako część play - Uruchom playbook wdrożeniowy:
ansible-playbook -i hosts deploy.yml
Jeśli wszystko jest odpowiednio skonfigurowane, to polecenie utworzy następującą strukturę katalogów na Twoim serwerze. Zobacz, jak będzie wyglądać struktura folderów hostów po jednym, dwóch i trzech wdrożeniach.
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509145325
|-- releases
| |-- 20100509145325
|-- shared
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509150741
|-- releases
| |-- 20100509150741
| |-- 20100509145325
|-- shared
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100512131539
|-- releases
| |-- 20100512131539
| |-- 20100509150741
| |-- 20100509145325
|-- shared
Wdrożenia szeregowe
Aby zapobiec różnym znacznikom czasowym podczas wdrażania na wielu serwerach za pomocą opcji serial
, powinieneś ustawić zmienną ansistrano_release_version
.
ansible-playbook -i hosts -e "ansistrano_release_version=`date -u +%Y%m%d%H%M%SZ`" deploy.yml
Cofanie zmian
Aby cofnąć zmiany za pomocą Ansistrano, musisz skonfigurować wdrożenie i uruchomić playbook cofania.
ansible-playbook -i hosts rollback.yml
Jeśli próbujesz cofnąć zmiany, gdy nie ma wdrożeń, pojawi się błąd i nie zostaną podjęte żadne działania.
Zmienne, które możesz dostosować w roli cofania, są mniejsze niż w roli wdrożeniowej:
vars:
ansistrano_deploy_to: "/var/www/my-app"
ansistrano_version_dir: "releases"
ansistrano_current_dir: "current"
ansistrano_rollback_to_release: ""
ansistrano_remove_rolled_back: yes
ansistrano_allow_anonymous_stats: yes
# Hooki: niestandardowe zadania, jeśli ich potrzebujesz
ansistrano_rollback_before_setup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-rollback-before-setup-tasks.yml"
ansistrano_rollback_after_setup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-rollback-after-setup-tasks.yml"
ansistrano_rollback_before_symlink_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-rollback-before-symlink-tasks.yml"
ansistrano_rollback_after_symlink_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-rollback-after-symlink-tasks.yml"
ansistrano_rollback_before_cleanup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-rollback-before-cleanup-tasks.yml"
ansistrano_rollback_after_cleanup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-rollback-after-cleanup-tasks.yml"
Środowisko wielostopniowe (devel, preprod, prod itp.)
Jeśli chcesz wdrażać w różnych środowiskach takich jak deweloperskie, preprodukcja i produkcja, zaleca się utworzenie różnych plików hostów. Kiedy to zrobisz, możesz określić inny plik hosta, uruchamiając playbook wdrożeniowy, używając parametru -i. W każdym pliku hosta możesz określić różnych użytkowników, hasła, parametry połączenia itd.
ansible-playbook -i hosts_devel deploy.yml
ansible-playbook -i hosts_preprod deploy.yml
ansible-playbook -i hosts_prod deploy.yml
Hooki: Niestandardowe zadania
Zazwyczaj będziesz musiał ponownie załadować swój serwer www po kroku Symlink
, pobrać zależności przed Aktualizacją kodu
lub nawet zrobić to w produkcji przed Symlink
. W związku z tym, aby wykonać niestandardowe zadania, masz kilka hooków, które Ansistrano wykona przed i po każdym z trzech głównych kroków. To jest główna zaleta w porównaniu do innych podobnych ról wdrożeniowych.
-- /moja-lokalna-maszyna/my-app.com
|-- hosts
|-- deploy.yml
|-- moje-niestandardowe-zadania
| |-- before-code-update.yml
| |-- after-code-update.yml
| |-- before-symlink.yml
| |-- after-symlink.yml
| |-- before-cleanup.yml
| |-- after-cleanup.yml
Na przykład, aby ponownie uruchomić Apache po kroku Symlink
, dodamy do pliku after-symlink.yml
- name: Restart Apache
service: name=httpd state=reloaded
- P: Gdzie dodałbyś wysyłanie powiadomienia e-mail po wdrożeniu?
- P: (dla programistów PHP i Symfony) Gdzie wyczyściłbyś pamięć podręczną?
Możesz określić plik z niestandardowymi zadaniami dla przed i po każdym kroku używając zmiennych roli ansistrano_before_*_tasks_file
i ansistrano_after_*_tasks_file
. Zobacz "Zmienne roli" dla więcej informacji.
Zmienne w niestandardowych zadaniach
Podczas pisania plików z niestandardowymi zadaniami możesz potrzebować niektórych zmiennych, które Ansistrano udostępnia:
{{ ansistrano_release_path.stdout }}
: Ścieżka do aktualnego wdrożenia (prawdopodobnie będziesz ją najczęściej używać){{ ansistrano_releases_path }}
: Ścieżka do folderu wydań{{ ansistrano_shared_path }}
: Ścieżka do folderu współdzielonego (gdzie można przechowywać wspólne zasoby wydań){{ ansistrano_release_version }}
: Względna nazwa katalogu dla wydania (domyślnie równa aktualnemu znacznikowi czasu w strefie czasowej UTC)
Przycinanie starych wydań
W środowiskach continuous delivery możesz mieć dużą liczbę wydań w produkcji. Może masz dużo miejsca i Cię to nie obchodzi, ale powszechną praktyką jest utrzymanie tylko określonej liczby wydań.
Po wdrożeniu, jeśli chcesz usunąć stare wersje, ustaw zmienną ansistrano_keep_releases
na łączną liczbę wydań, które chcesz zachować.
Zobaczmy trzy wdrożenia z konfiguracją ansistrano_keep_releases: 2
:
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509145325
|-- releases
| |-- 20100509145325
|-- shared
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509150741
|-- releases
| |-- 20100509150741
| |-- 20100509145325
|-- shared
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100512131539
|-- releases
| |-- 20100512131539
| |-- 20100509150741
|-- shared
Zobacz, jak wydanie 20100509145325
zostało usunięte.
Przykładowy playbook
W folderze example
możesz sprawdzić przykładowy projekt, który pokazuje, jak wdrożyć małą aplikację za pomocą Ansistrano.
Aby go uruchomić, będziesz potrzebować Vagranta i zainstalowanych ról ansistrano. Proszę sprawdzić https://www.vagrantup.com, aby uzyskać więcej informacji o Vagrancie oraz naszą sekcję Instalacja.
$ cd example/my-playbook
$ vagrant up
$ ansible-playbook -i hosts deploy.yml
Po uruchomieniu tych poleceń plik index.html znajdujący się w folderze my-app
zostanie wdrożony na obie maszyny vagrant.
Aby przetestować playbook cofania, będziesz musiał uruchomić deploy.yml przynajmniej dwa razy (aby było coś, do czego można się cofnąć). A po tym wystarczy uruchomić
$ ansible-playbook -i hosts rollback.yml
Możesz również sprawdzić bardziej zaawansowane przykłady wewnątrz folderu testowego, które są uruchamiane na Travis-CI.
Przykładowe projekty
Dodaliśmy wsparcie Ansistrano dla innych projektów, nad którymi pracujemy.
- LastWishes: Przykład aplikacji PHP oparty na DDD: https://github.com/dddinphp/last-wishes
Na przykład, zobacz log wykonania wdrożenia LastWishes:
PLAY [Wdrożenie aplikacji last wishes na mój serwer] ************************************
GATHERING FACTS ***************************************************************
ok: [quepimquepam.com]
TASK: [ansistrano.deploy | Upewnij się, że istnieje baza dyskowa wdrożenia] ***
ok: [quepimquepam.com]
TASK: [ansistrano.deploy | Upewnij się, że istnieje folder wydań] ***
ok: [quepimquepam.com]
TASK: [ansistrano.deploy | Upewnij się, że istnieje folder współdzielony] ***
ok: [quepimquepam.com]
TASK: [ansistrano.deploy | Pobierz znacznik czasowy wydania] ***********
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Pobierz ścieżkę wydania] ****************
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Pobierz ścieżkę wydań] ***************
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Pobierz ścieżkę współdzieloną (w przypadku rsync)] ***
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Prześlij pliki aplikacji do zdalnej kopii współdzielonej (w przypadku rsync)] ***
changed: [quepimquepam.com -> 127.0.0.1]
TASK: [ansistrano.deploy | Wdrożenie istniejącego kodu na serwerach] ***
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Wdrażanie istniejącego kodu na zdalnych serwerach] ***
skipping: [quepimquepam.com]
TASK: [ansistrano.deploy | Aktualizuj zdalne repozytorium] ********
skipping: [quepimquepam.com]
TASK: [ansistrano.deploy | Eksportuj kopię repozytorium] *******
skipping: [quepimquepam.com]
TASK: [ansistrano.deploy | Wdrażaj kod na serwery] *****
skipping: [quepimquepam.com]
TASK: [ansistrano.deploy | Skopiuj znacznik wersji do pliku REVISION] ***
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Dopracowanie kodu wydania] *****
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Zmień miękki link na nowe wydanie] ***
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Przeładuj Apache] *******************
changed: [quepimquepam.com]
TASK: [ansistrano.deploy | Oczyść wydania] ***************
skipping: [quepimquepam.com]
PLAY RECAP ********************************************************************
quepimquepam.com : ok=14 changed=10 unreachable=0 failed=0
Mówią o nas
- Pablo Godel - Wdrażanie Symfony - Symfony Cat 2016
- https://www.artansoft.com/2016/05/deploy-de-proyectos-php-ansistrano/
- http://alexmoreno.net/ansistrano-deploying-drupal-ansible
- http://www.ricardclau.com/2015/10/deploying-php-applications-with-ansistrano/
- http://es.slideshare.net/OrestesCA/ansible-intro-ansible-barcelona-user-group-june-2015
- http://carlosbuenosvinos.com/deploying-symfony-and-php-apps-with-ansistrano/
- https://www.youtube.com/watch?v=CPz5zPzzMZE
- https://github.com/cbrunnkvist/ansistrano-symfony-deploy
- https://www.reddit.com/r/ansible/comments/2ezzz5/rapid_rollback_with_ansible/
- Cookiecutting Ansible for Django
- Wdrażanie aplikacji PHP za pomocą Ansible, Ansible Vault i Ansistrano
Licencja
MIT
Inne źródła
Ansible role to deploy scripting applications like PHP, Python, Ruby, etc. in a Capistrano style
ansible-galaxy install ansistrano.deploy