ansistrano.deploy

Ansistrano

Status budowy Liczba wdrożeń Liczba wdrożeń w tym roku Liczba wdrożeń w tym miesiącu Liczba wdrożeń dzisiaj

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.

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ą:

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żania rsync, rsync_direct lub git, albo jeśli używasz ansistrano_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”)

Przebieg Ansistrano

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.

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

Licencja

MIT

Inne źródła

O projekcie

Ansible role to deploy scripting applications like PHP, Python, Ruby, etc. in a Capistrano style

Zainstaluj
ansible-galaxy install ansistrano.deploy
Licencja
mit
Pobrania
2.5M
Właściciel
Deploying applications with Ansible in Capistrano style