Mete kanpe yon sèvè pou deplwaye yon aplikasyon Rails lè l sèvi avèk Ansible

Sa pa gen lontan mwen te bezwen ekri plizyè liv Ansible pou prepare sèvè a pou deplwaye yon aplikasyon Rails. Epi, etonan, mwen pa t jwenn yon senp manyèl etap pa etap. Mwen pa t 'vle kopye liv jwèt yon lòt moun san yo pa konprann sa k ap pase, epi nan fen a mwen te oblije li dokiman an, kolekte tout bagay tèt mwen. Petèt mwen ka ede yon moun akselere pwosesis sa a ak èd nan atik sa a.

Premye bagay yo konprann se ke ansible bay ou ak yon koòdone pratik fè yon lis predefini nan aksyon sou yon sèvè aleka (yo) atravè SSH. Pa gen okenn maji isit la, ou pa ka enstale yon Plugin epi jwenn yon deplwaman zewo D 'nan aplikasyon w lan ak docker, siveyans ak lòt bagay ki soti nan bwat la. Pou w ka ekri yon liv, ou dwe konnen ki sa egzakteman ou vle fè ak kijan pou fè li. Se poutèt sa mwen pa satisfè ak liv ki pare yo soti nan GitHub, oswa atik tankou: "Kopi epi kouri, li pral travay."

Kisa nou bezwen?

Kòm mwen te deja di, yo nan lòd yo ekri yon liv jwèt ou bezwen konnen ki sa ou vle fè ak ki jan fè li. Ann deside sa nou bezwen. Pou yon aplikasyon Rails nou pral bezwen plizyè pakè sistèm: nginx, postgresql (redis, elatriye). Anplis de sa, nou bezwen yon vèsyon espesifik nan Ruby. Li pi bon pou enstale li atravè rbenv (rvm, asdf...). Kouri tout bagay sa yo kòm yon itilizatè rasin se toujou yon move lide, kidonk ou bezwen kreye yon itilizatè separe ak konfigirasyon dwa li yo. Apre sa, ou bezwen telechaje kòd nou an sou sèvè a, kopye konfigirasyon yo pou nginx, postgres, elatriye epi kòmanse tout sèvis sa yo.

Kòm yon rezilta, sekans aksyon an se jan sa a:

  1. Konekte kòm rasin
  2. enstale pakè sistèm yo
  3. kreye yon nouvo itilizatè, konfigirasyon dwa, kle ssh
  4. konfigirasyon pakè sistèm (nginx elatriye) epi kouri yo
  5. Nou kreye yon itilizatè nan baz done a (ou ka imedyatman kreye yon baz done)
  6. Konekte kòm yon nouvo itilizatè
  7. Enstale rbenv ak ruby
  8. Enstale bundler la
  9. Téléchargement kòd aplikasyon an
  10. Lanse sèvè Puma a

Anplis, dènye etap yo ka fè lè l sèvi avèk capistrano, omwen soti nan bwat la li ka kopye kòd nan repèrtwar lage, chanje liberasyon an ak yon lyen senbolik sou deplwaman siksè, kopye konfigirasyon soti nan yon anyè pataje, rekòmanse puma, elatriye. Tout bagay sa yo ka fè lè l sèvi avèk Ansible, men poukisa?

Estrikti dosye

Ansible gen strik estrikti dosye pou tout fichye ou yo, kidonk li pi bon pou kenbe tout bagay nan yon anyè separe. Anplis, li pa tèlman enpòtan si li pral nan aplikasyon an ray tèt li, oswa separeman. Ou ka estoke fichye yo nan yon depo git separe. Pèsonèlman, mwen te jwenn li pi pratik pou kreye yon anyè ansible nan anyè /config aplikasyon rails la epi estoke tout bagay nan yon sèl depo.

Liv senp

Playbook se yon dosye yml ki, lè l sèvi avèk sentaks espesyal, dekri sa Ansible ta dwe fè ak ki jan. Ann kreye premye liv ki pa fè anyen:

---
- name: Simple playbook
  hosts: all

Isit la nou tou senpleman di ke playbook nou an rele Simple Playbook e ke sa ki ladan yo ta dwe egzekite pou tout lame. Nou ka sove li nan /ansible anyè ak non an playbook.yml epi eseye kouri:

ansible-playbook ./playbook.yml

PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched

Ansible di ke li pa konnen okenn lame ki matche ak lis la tout. Yo dwe fè lis nan yon espesyal dosye envantè.

Ann kreye li nan menm anyè a:

123.123.123.123

Men ki jan nou tou senpleman presize lame a (depreferans lame a nan VPS nou an pou tès, oswa ou ka anrejistre localhost) epi sove li anba non an. inventory.
Ou ka eseye kouri ansible ak yon dosye envantè:

ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************

PLAY RECAP ************************************************************************************************************************************

Si ou gen aksè ssh nan lame a espesifye, Lè sa a, ansible pral konekte ak kolekte enfòmasyon sou sistèm nan aleka. (default TASK [Gathering Facts]) apre sa li pral bay yon rapò kout sou ekzekisyon an (PLAY RECAP).

Pa default, koneksyon an sèvi ak non itilizatè a anba ki ou konekte nan sistèm lan. Li gen plis chans pa pral sou lame a. Nan dosye playbook la, ou ka presize ki itilizatè pou itilize pou konekte avèk direktiv remote_user la. Epitou, enfòmasyon sou yon sistèm aleka ka souvan pa nesesè pou ou epi ou pa ta dwe pèdi tan kolekte li. Travay sa a kapab tou enfim:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

Eseye kouri playbook la ankò epi asire w ke koneksyon an ap travay. (Si ou espesifye itilizatè a rasin, Lè sa a, ou bezwen tou presize vin: verite direktiv la nan lòd yo jwenn dwa elve. Jan sa ekri nan dokiman an: become set to ‘true’/’yes’ to activate privilege escalation. byenke li pa totalman klè poukisa).

Petèt ou pral resevwa yon erè ki te koze pa lefèt ke ansible pa ka detèmine entèprèt la Python, Lè sa a, ou ka presize li manyèlman:

ansible_python_interpreter: /usr/bin/python3 

Ou ka chèche konnen ki kote ou gen python ak lòd la whereis python.

Enstale pakè sistèm yo

Distribisyon estanda Ansible a gen ladann anpil modil pou travay ak pakè sistèm divès kalite, kidonk nou pa bezwen ekri scripts bash pou nenpòt ki rezon. Koulye a, nou bezwen youn nan modil sa yo mete ajou sistèm nan ak enstale pakè sistèm yo. Mwen gen Ubuntu Linux sou VPS mwen an, kidonk enstale pakè mwen itilize yo apt-get и modil pou li. Si w ap itilize yon sistèm opere diferan, Lè sa a, ou ka bezwen yon modil diferan (sonje, mwen te di nan kòmansman an ke nou bezwen konnen davans ki sa ak ki jan nou pral fè). Sepandan, sentaks la pral gen plis chans sanble.

Ann konplete liv jwèt nou an ak premye travay yo:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

Travay se egzakteman travay ke Ansible pral fè sou sèvè aleka. Nou bay travay la yon non pou nou ka swiv ekzekisyon li nan boutèy la. Epi nou dekri, lè l sèvi avèk sentaks nan yon modil espesifik, sa li bezwen fè. Nan ka sa apt: update_cache=yes - di pou mete ajou pakè sistèm yo lè l sèvi avèk modil apt la. Dezyèm kòmandman an se yon ti kras pi konplike. Nou pase yon lis pakè nan modil apt la epi nou di ke yo ye state ta dwe vin present, se sa ki, nou di enstale pakè sa yo. Nan yon fason menm jan an, nou ka di yo efase yo, oswa mete ajou yo pa tou senpleman chanje state. Tanpri sonje ke pou ray yo travay ak postgresql nou bezwen pake a postgresql-contrib, ke nou ap enstale kounye a. Ankò, ou bezwen konnen epi fè sa; ansible pou kont li pa pral fè sa.

Eseye kouri playbook la ankò epi tcheke si pakè yo enstale.

Kreye nouvo itilizatè yo.

Pou travay ak itilizatè, Ansible gen tou yon modil - itilizatè. Ann ajoute yon lòt travay (mwen kache pati ki deja konnen nan liv la dèyè kòmantè yo pou pa kopye li nèt chak fwa):

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: my_user
        shell: /bin/bash
        password: "{{ 123qweasd | password_hash('sha512') }}"

Nou kreye yon nouvo itilizatè, mete yon schell ak modpas pou li. Apre sa, nou kouri nan plizyè pwoblèm. E si non itilizatè yo bezwen diferan pou diferan lame? Ak estoke modpas la nan tèks klè nan playbook la se yon trè move lide. Pou kòmanse, ann mete non itilizatè a ak modpas la nan varyab, ak nan fen atik la mwen pral montre ki jan yo ankripte modpas la.

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"

Varyab yo mete nan liv jwèt lè l sèvi avèk aparèy òtopedik boukle doub.

Nou pral endike valè varyab yo nan dosye envantè a:

123.123.123.123

[all:vars]
user=my_user
user_password=123qweasd

Tanpri sonje direktiv la [all:vars] - li di ke pwochen blòk tèks la se varyab (vars) epi yo aplikab a tout lame (tout).

Konsepsyon an tou enteresan "{{ user_password | password_hash('sha512') }}". Bagay la se ke ansible pa enstale itilizatè a atravè user_add tankou ou ta fè li manyèlman. Epi li sove tout done dirèkteman, ki se poukisa nou dwe tou konvèti modpas la nan yon hash davans, ki se sa kòmand sa a fè.

Ann ajoute itilizatè nou an nan gwoup sudo a. Sepandan, anvan sa nou bezwen asire w ke yon gwoup sa a egziste paske pèsonn pa pral fè sa pou nou:

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
        name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"

Tout bagay se byen senp, nou gen tou yon modil gwoup pou kreye gwoup, ak yon sentaks ki sanble anpil ak apt. Lè sa a, li ase pou anrejistre gwoup sa a bay itilizatè a (groups: "sudo").
Li itil tou pou ajoute yon kle ssh nan itilizatè sa a pou nou ka konekte lè l sèvi avèk li san yon modpas:

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
      name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"
    - name: Deploy SSH Key
      authorized_key:
        user: "{{ user }}"
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
        state: present

Nan ka sa a, konsepsyon an se enteresan "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" — li kopye sa ki nan fichye id_rsa.pub (non ou ka diferan), sa vle di, pati piblik kle ssh la epi telechaje li nan lis kle otorize pou itilizatè a sou sèvè a.

Wòl

Tout twa travay pou kreye itilizasyon yo ka fasilman klase nan yon gwoup travay, epi li ta yon bon lide pou estoke gwoup sa a separeman de liv prensipal la pou li pa grandi twò gwo. Pou rezon sa a, Ansible genyen wòl.
Dapre estrikti dosye ki endike nan kòmansman an, wòl yo dwe mete yo nan yon anyè wòl separe, pou chak wòl gen yon anyè separe ak menm non, andedan anyè travay, fichye, modèl, elatriye.
Ann kreye yon estrikti dosye: ./ansible/roles/user/tasks/main.yml (prensipal se dosye prensipal la ki pral chaje ak egzekite lè yon wòl konekte ak playbook la; lòt dosye wòl yo ka konekte ak li). Koulye a, ou ka transfere tout travay ki gen rapò ak itilizatè a nan dosye sa a:

# Create user and add him to groups
- name: Ensure a 'sudo' group
  group:
    name: sudo
    state: present

- name: Add a new user
  user:
    name: "{{ user }}"
    shell: /bin/bash
    password: "{{ user_password | password_hash('sha512') }}"
    groups: "sudo"

- name: Deploy SSH Key
  authorized_key:
    user: "{{ user }}"
    key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    state: present

Nan liv prensipal la, ou dwe presize pou itilize wòl itilizatè a:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

  roles:
    - user

Epitou, li ka fè sans pou mete ajou sistèm nan anvan tout lòt travay; pou fè sa, ou ka chanje non blòk la tasks kote yo defini nan pre_tasks.

Mete kanpe nginx

Nou ta dwe deja enstale Nginx; nou bezwen konfigirasyon li epi kouri li. Ann fè li touswit nan wòl la. Ann kreye yon estrikti dosye:

- ansible
  - roles
    - nginx
      - files
      - tasks
        - main.yml
      - templates

Koulye a, nou bezwen dosye ak modèl. Diferans ki genyen ant yo se ke ansible kopye dosye yo dirèkteman, jan yo ye. Ak modèl yo dwe gen ekstansyon j2 a epi yo ka itilize valè varyab lè l sèvi avèk menm atèl doub Curly.

Ann pèmèt nginx nan main.yml dosye. Pou sa nou gen yon modil systemd:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

Isit la nou pa sèlman di ke nginx dwe kòmanse (ki se, nou lanse li), men nou imedyatman di ke li dwe aktive.
Koulye a, ann kopye fichye konfigirasyon yo:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'

Nou kreye dosye prensipal la konfigirasyon nginx (ou ka pran li dirèkteman nan sèvè a, oswa ekri li tèt ou). Epi tou dosye a konfigirasyon pou aplikasyon nou an nan anyè sites_available (sa a pa nesesè men itil). Nan premye ka a, nou itilize modil kopi a pou kopye fichye yo (fichye a dwe nan /ansible/roles/nginx/files/nginx.conf). Nan dezyèm lan, nou kopye modèl la, ranplase valè yo nan varyab yo. Modèl la ta dwe nan /ansible/roles/nginx/templates/my_app.j2). Epi li ta ka sanble yon bagay tankou sa a:

upstream {{ app_name }} {
  server unix:{{ app_path }}/shared/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name {{ server_name }} {{ inventory_hostname }};
  root {{ app_path }}/current/public;

  try_files $uri/index.html $uri.html $uri @{{ app_name }};
  ....
}

Peye atansyon sou foure yo {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} - sa yo se tout varyab ki gen valè Ansible pral ranplase nan modèl la anvan kopye. Sa a itil si w itilize yon liv pou diferan gwoup lame yo. Pou egzanp, nou ka ajoute dosye envantè nou an:

[production]
123.123.123.123

[staging]
231.231.231.231

[all:vars]
user=my_user
user_password=123qweasd

[production:vars]
server_name=production
app_path=/home/www/my_app
app_name=my_app

[staging:vars]
server_name=staging
app_path=/home/www/my_stage
app_name=my_stage_app

Si nou kounye a lanse playbook nou an, li pral fè travay yo espesifye pou tou de lame yo. Men, an menm tan an, pou yon lame staging, varyab yo pral diferan de sa yo pwodiksyon, epi yo pa sèlman nan wòl ak playbooks, men tou nan konfigirasyon nginx. {{ inventory_hostname }} pa bezwen espesifye nan dosye a envantè - sa a varyab espesyal ansib ak lame a pou ki liv la ap kouri kounye a se estoke la.
Si ou vle gen yon dosye envantè pou plizyè lame, men sèlman kouri pou yon gwoup, sa ka fè ak lòd sa a:

ansible-playbook -i inventory ./playbook.yml -l "staging"

Yon lòt opsyon se gen dosye envantè separe pou diferan gwoup. Oswa ou ka konbine de apwòch yo si ou gen anpil lame diferan.

Ann tounen nan mete kanpe nginx. Apre w fin kopye fichye konfigirasyon yo, nou bezwen kreye yon lyen senbolik nan sitest_enabled nan my_app.conf soti nan sites_available. Epi rekòmanse nginx.

... # old code in mail.yml

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted

Tout bagay se senp isit la - ankò modil ansible ak yon sentaks san patipri estanda. Men, gen yon pwen. Pa gen okenn pwen nan rekòmanse nginx chak fwa. Èske w te remake ke nou pa ekri kòmandman tankou: "fè sa a tankou sa a", sentaks la sanble plis tankou "sa a ta dwe gen eta sa a". Ak pi souvan sa a se egzakteman ki jan ansible travay. Si gwoup la deja egziste, oswa pake sistèm lan deja enstale, Lè sa a, ansible pral tcheke pou sa a epi sote travay la. Epitou, dosye yo pa pral kopye si yo konplètman matche ak sa ki deja sou sèvè a. Nou ka pran avantaj de sa a epi rekòmanse nginx sèlman si dosye konfigirasyon yo te chanje. Gen yon direktiv enskri pou sa a:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes
  register: restart_nginx

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'
  register: restart_nginx

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted
  when: restart_nginx.changed

Si youn nan fichye konfigirasyon yo chanje, yo pral fè yon kopi epi yo pral anrejistre varyab la restart_nginx. Epi sèlman si varyab sa a te anrejistre sèvis la pral rekòmanse.

Epi, nan kou, ou bezwen ajoute wòl nginx nan liv prensipal la.

Mete kanpe postgresql

Nou bezwen pèmèt postgresql lè l sèvi avèk systemd nan menm fason an kòm nou te fè ak nginx, epi tou kreye yon itilizatè ke nou pral itilize jwenn aksè nan baz done a ak baz done a tèt li.
Ann kreye yon wòl /ansible/roles/postgresql/tasks/main.yml:

# Create user in postgresql
- name: enable postgresql and start
  systemd:
    name: postgresql
    state: started
    enabled: yes

- name: Create database user
  become_user: postgres
  postgresql_user:
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    role_attr_flags: SUPERUSER

- name: Create database
  become_user: postgres
  postgresql_db:
    name: "{{ db_name }}"
    encoding: UTF-8
    owner: "{{ db_user }}"

Mwen pa pral dekri ki jan yo ajoute varyab nan envantè, sa a te deja fè anpil fwa, osi byen ke sentaks la nan modil postgresql_db ak postgresql_user. Ou ka jwenn plis enfòmasyon nan dokiman an. Direktiv ki pi enteresan isit la se become_user: postgres. Reyalite a se ke pa default, se sèlman itilizatè a postgres ki gen aksè nan baz done a postgresql epi sèlman lokalman. Direktiv sa a pèmèt nou egzekite kòmandman sou non itilizatè sa a (si nou gen aksè, nan kou).
Epitou, ou ka oblije ajoute yon liy nan pg_hba.conf pou pèmèt yon nouvo itilizatè aksè nan baz done a. Sa a ka fè menm jan ak nou chanje konfigirasyon nginx la.

Ak nan kou, ou bezwen ajoute wòl nan postgresql nan liv prensipal la.

Enstale ruby ​​via rbenv

Ansible pa gen modil pou travay ak rbenv, men li enstale pa klonaj yon depo git. Se poutèt sa, pwoblèm sa a vin youn ki pi ki pa estanda. Ann kreye yon wòl pou li /ansible/roles/ruby_rbenv/main.yml epi ann kòmanse ranpli li:

# Install rbenv and ruby
- name: Install rbenv
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv

Nou ankò sèvi ak direktiv become_user pou travay anba itilizatè nou te kreye pou rezon sa yo. Depi rbenv enstale nan anyè lakay li, epi li pa globalman. Epi nou menm tou nou itilize modil git la pou klonaj repozitwa a, espesifye repo ak dest.

Apre sa, nou bezwen anrejistre rbenv init nan bashrc epi ajoute rbenv nan PATH la. Pou sa nou gen modil lineinfile:

- name: Add rbenv to PATH
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'export PATH="${HOME}/.rbenv/bin:${PATH}"'

- name: Add rbenv init to bashrc
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'eval "$(rbenv init -)"'

Lè sa a, ou bezwen enstale ruby_build:

- name: Install ruby-build
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build

Epi finalman enstale Ruby. Sa a se fè atravè rbenv, se sa ki, tou senpleman ak lòd la bash:

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    rbenv install {{ ruby_version }}
  args:
    executable: /bin/bash

Nou di ki lòd pou egzekite ak kisa. Sepandan, isit la nou rankontre lefèt ke ansible pa kouri kòd ki genyen nan bashrc anvan yo kouri kòmandman yo. Sa vle di ke rbenv pral gen yo dwe defini dirèkteman nan menm script la.

Pwoblèm nan pwochen se akòz lefèt ke lòd la koki pa gen okenn eta nan yon pwen de vi ansible. Sa vle di, pa pral gen okenn chèk otomatik si vèsyon sa a nan Ruby enstale oswa ou pa. Nou ka fè sa nou menm:

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    if ! rbenv versions | grep -q {{ ruby_version }}
      then rbenv install {{ ruby_version }} && rbenv global {{ ruby_version }}
    fi
  args:
    executable: /bin/bash

Tout sa ki rete se enstale bundler:

- name: Install bundler
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    gem install bundler

Epi ankò, ajoute wòl nou ruby_rbenv nan liv prensipal la.

Fichye pataje.

An jeneral, konfigirasyon an ka ranpli isit la. Apre sa, tout sa ki rete se kouri capistrano epi li pral kopye kòd la tèt li, kreye repèrtwar ki nesesè yo epi lanse aplikasyon an (si tout bagay se configuré kòrèkteman). Sepandan, capistrano souvan mande pou fichye konfigirasyon adisyonèl, tankou database.yml oswa .env Yo ka kopye jis tankou dosye ak modèl pou nginx. Gen yon sèl sibtilite. Anvan w kopye dosye, ou bezwen kreye yon estrikti anyè pou yo, yon bagay tankou sa a:

# Copy shared files for deploy
- name: Ensure shared dir
  become_user: "{{ user }}"
  file:
    path: "{{ app_path }}/shared/config"
    state: directory

nou presize sèlman yon sèl anyè epi ansible pral otomatikman kreye paran si sa nesesè.

Ansible Vault

Nou te deja vin atravè lefèt ke varyab yo ka genyen done sekrè tankou modpas itilizatè a. Si ou te kreye .env dosye pou aplikasyon an, epi database.yml Lè sa a, dwe gen menm plis done kritik sa yo. Li ta bon pou kache yo anba je furter. Pou rezon sa a yo itilize li vout ansible.

Ann kreye yon dosye pou varyab /ansible/vars/all.yml (Isit la ou ka kreye dosye diferan pou diferan gwoup lame, jis tankou nan dosye a envantè: production.yml, staging.yml, elatriye).
Tout varyab ki dwe chiffres dwe transfere nan fichye sa a lè l sèvi avèk sentaks yml estanda:

# System vars
user_password: 123qweasd
db_password: 123qweasd

# ENV vars
aws_access_key_id: xxxxx
aws_secret_access_key: xxxxxx
aws_bucket: bucket_name
rails_secret_key_base: very_secret_key_base

Apre sa, dosye sa a ka chiffres ak kòmandman an:

ansible-vault encrypt ./vars/all.yml

Natirèlman, lè chifreman, w ap bezwen mete yon modpas pou dechifre. Ou ka wè sa ki pral andedan dosye a apre w fin rele lòd sa a.

Pa vle di nan ansible-vault decrypt ka fichye a dwe dechifre, modifye ak Lè sa a, chiffres ankò.

Ou pa bezwen dechifre dosye a pou travay. Ou estoke li ankripte epi kouri playbook la ak agiman an --ask-vault-pass. Ansible pral mande modpas la, rekipere varyab yo, epi egzekite travay yo. Tout done yo ap rete chiffres.

Kòmandman konplè a pou plizyè gwoup lame ak vout ansible ap gade yon bagay tankou sa a:

ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass

Men, mwen pa pral ba ou tèks la konplè nan liv ak wòl, ekri li tèt ou. Paske ansible se konsa - si ou pa konprann sa ki bezwen fè, Lè sa a, li pa pral fè li pou ou.

Sous: www.habr.com

Add nouvo kòmantè