Twaqqif ta 'server biex tiskjera applikazzjoni Rails bl-użu ta' Ansible

Ftit ilu kelli bżonn nikteb diversi playbooks Ansible biex nipprepara s-server għall-iskjerament ta' applikazzjoni Rails. U, b'mod sorprendenti, ma sibtx manwal sempliċi pass pass. Ma ridtx nikkopja l-playbook ta’ xi ħadd ieħor mingħajr ma nifhem x’qed jiġri, u fl-aħħar kelli naqra d-dokumentazzjoni, niġbor kollox jien. Forsi nista 'ngħin lil xi ħadd iħaffef dan il-proċess bl-għajnuna ta' dan l-artikolu.

L-ewwel ħaġa li għandek tifhem hija li ansible jagħtik interface konvenjenti biex twettaq lista predefinita ta 'azzjonijiet fuq server(i) remoti permezz ta' SSH. M'hemm l-ebda maġija hawn, ma tistax tinstalla plugin u tikseb skjerament żero ta 'waqfien tal-applikazzjoni tiegħek b'docker, monitoraġġ u goodies oħra barra mill-kaxxa. Sabiex tikteb playbook, trid tkun taf eżattament x'tixtieq tagħmel u kif tagħmel dan. Huwa għalhekk li m'iniex sodisfatt bi playbooks lesti minn GitHub, jew artikoli bħal: "Ikkopja u mexxi, se taħdem."

Dak li għandna bżonn?

Kif diġà għedt, biex tikteb playbook trid tkun taf x'tixtieq tagħmel u kif tagħmel dan. Ejja niddeċiedu dak li għandna bżonn. Għal applikazzjoni Rails ser ikollna bżonn diversi pakketti tas-sistema: nginx, postgresql (redis, eċċ). Barra minn hekk, għandna bżonn verżjoni speċifika ta 'ruby. L-aħjar huwa li tinstallah permezz ta 'rbenv (rvm, asdf...). It-tmexxija ta 'dan kollu bħala utent root hija dejjem idea ħażina, għalhekk għandek bżonn toħloq utent separat u tikkonfigura d-drittijiet tiegħu. Wara dan, għandek bżonn ittella' l-kodiċi tagħna fuq is-server, tikkopja l-konfigurazzjonijiet għal nginx, postgres, eċċ u tibda dawn is-servizzi kollha.

Bħala riżultat, is-sekwenza tal-azzjonijiet hija kif ġej:

  1. Idħol bħala root
  2. tinstalla pakketti tas-sistema
  3. toħloq utent ġdid, ikkonfigura d-drittijiet, ċavetta ssh
  4. kkonfigurat pakketti tas-sistema (nginx eċċ) u mexxihom
  5. Aħna noħolqu utent fid-database (tista 'minnufih toħloq database)
  6. Idħol bħala utent ġdid
  7. Installa rbenv u ruby
  8. Installazzjoni tal-bundler
  9. Tlugħ tal-kodiċi tal-applikazzjoni
  10. Tnedija tas-server Puma

Barra minn hekk, l-aħħar stadji jistgħu jsiru bl-użu ta 'capistrano, għall-inqas barra mill-kaxxa tista' tikkopja l-kodiċi f'direttorji ta 'rilaxx, taqleb ir-rilaxx b'link simboliku mal-iskjerament b'suċċess, tikkopja konfigurazzjonijiet minn direttorju kondiviż, terġa' tibda puma, eċċ. Dan kollu jista 'jsir bl-użu ta' Ansible, imma għaliex?

Struttura tal-fajl

Ansible għandu strett struttura tal-fajl għall-fajls kollha tiegħek, għalhekk huwa aħjar li żżommha kollha f'direttorju separat. Barra minn hekk, mhuwiex daqshekk importanti jekk hux se jkun fl-applikazzjoni tal-binarji nnifisha, jew separatament. Tista 'taħżen fajls f'repożitorju git separat. Personalment, sibtha l-aktar konvenjenti li toħloq direttorju ansible fid-direttorju / config tal-applikazzjoni tal-binarji u taħżen kollox f'repożitorju wieħed.

Playbook sempliċi

Playbook huwa fajl yml li, bl-użu ta' sintassi speċjali, jiddeskrivi x'għandu jagħmel Ansible u kif. Ejja noħolqu l-ewwel playbook li ma jagħmel xejn:

---
- name: Simple playbook
  hosts: all

Hawnhekk aħna sempliċement ngħidu li l-playbook tagħna jissejjaħ Simple Playbook u li l-kontenut tiegħu għandu jiġi esegwit għall-ospiti kollha. Nistgħu nsalvawh f'/direttorju ansible bl-isem playbook.yml u ipprova tmexxi:

ansible-playbook ./playbook.yml

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

Ansible jgħid li ma jaf l-ebda hosts li jaqblu mal-lista kollha. Għandhom jiġu elenkati fi speċjali fajl tal-inventarju.

Ejja noħolquha fl-istess direttorju ansible:

123.123.123.123

Dan huwa kif aħna sempliċement nispeċifikaw il-host (idealment l-host tal-VPS tagħna għall-ittestjar, jew tista 'tirreġistra localhost) u ssejvjah taħt l-isem inventory.
Tista' tipprova tħaddem ansible b'fajl ta' inventarju:

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

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

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

Jekk għandek aċċess ssh għall-host speċifikat, allura ansible se jgħaqqad u jiġbor informazzjoni dwar is-sistema remota. (DEfault TASK [Gathering Facts]) wara dan jagħti rapport qasir dwar l-eżekuzzjoni (PLAY RECAP).

B'mod awtomatiku, il-konnessjoni tuża l-isem tal-utent li taħtu tkun illoggjat fis-sistema. X'aktarx mhux se jkun fuq l-ospitant. Fil-fajl tal-playbook, tista' tispeċifika liema utent tuża biex tikkonnettja billi tuża d-direttiva remote_user. Ukoll, l-informazzjoni dwar sistema remota ħafna drabi tista' ma tkunx meħtieġa għalik u m'għandekx taħli ħin tiġborha. Dan il-kompitu jista' wkoll jiġi diżattivat:

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

Ipprova tħaddem il-playbook mill-ġdid u kun żgur li l-konnessjoni qed taħdem. (Jekk speċifikajt l-utent għerq, imbagħad trid tispeċifika wkoll id-direttiva ssir: vera sabiex tikseb drittijiet elevati. Kif miktub fid-dokumentazzjoni: become set to ‘true’/’yes’ to activate privilege escalation. għalkemm mhux ċar għal kollox għaliex).

Forsi tirċievi żball ikkawżat mill-fatt li ansible ma jistax jiddetermina l-interpretu Python, allura tista 'tispeċifika manwalment:

ansible_python_interpreter: /usr/bin/python3 

Tista 'ssir taf fejn għandek python bil-kmand whereis python.

Installazzjoni ta' pakketti tas-sistema

Id-distribuzzjoni standard ta 'Ansible tinkludi ħafna moduli biex taħdem ma' diversi pakketti tas-sistema, għalhekk m'għandniex għalfejn niktbu skripts bash għal xi raġuni. Issa neħtieġu wieħed minn dawn il-moduli biex naġġornaw is-sistema u ninstallaw pakketti tas-sistema. Għandi Ubuntu Linux fuq il-VPS tiegħi, għalhekk biex ninstalla pakketti li nuża apt-get и modulu għaliha. Jekk qed tuża sistema operattiva differenti, allura jista 'jkollok bżonn modulu differenti (ftakar, għidt fil-bidu li għandna bżonn inkunu nafu minn qabel x'se nagħmlu u kif). Madankollu, is-sintassi x'aktarx tkun simili.

Ejja nissupplimentaw il-playbook tagħna bl-ewwel kompiti:

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

Il-kompitu huwa eżattament il-kompitu li Ansible se jwettaq fuq servers remoti. Aħna nagħtu isem lill-kompitu sabiex inkunu nistgħu nsegwu l-eżekuzzjoni tiegħu fil-ġurnal. U niddeskrivu, bl-użu tas-sintassi ta 'modulu speċifiku, dak li jeħtieġ li tagħmel. F'dan il-każ apt: update_cache=yes - jgħid li taġġorna l-pakketti tas-sistema billi tuża l-modulu apt. It-tieni kmand huwa ftit aktar ikkumplikat. Aħna ngħaddu lista ta 'pakketti lill-modulu apt u ngħidu li huma state għandha ssir present, jiġifieri, ngħidu jinstallaw dawn il-pakketti. B'mod simili, nistgħu ngħidulhom biex iħassruhom, jew jaġġornawhom billi sempliċement ibiddlu state. Jekk jogħġbok innota li biex il-binarji jaħdmu mal-postgresql għandna bżonn il-pakkett postgresql-contrib, li qed ninstallaw issa. Għal darb'oħra, trid tkun taf u tagħmel dan; ansible waħdu mhux se jagħmel dan.

Ipprova tħaddem il-playbook mill-ġdid u ċċekkja li l-pakketti huma installati.

Il-ħolqien ta' utenti ġodda.

Biex taħdem mal-utenti, Ansible għandu wkoll modulu - utent. Ejja nżidu kompitu ieħor (ħbejt il-partijiet diġà magħrufa tal-playbook wara l-kummenti biex ma nikkopjahx għal kollox kull darba):

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

Noħolqu utent ġdid, nistabbilixxu schell u password għaliha. U mbagħad niltaqgħu ma’ diversi problemi. X'jiġri jekk l-ismijiet tal-utent jeħtieġ li jkunu differenti għal hosts differenti? U l-ħażna tal-password f'test ċar fil-playbook hija idea ħażina ħafna. Biex tibda, ejja npoġġu l-isem tal-utent u l-password f'varjabbli, u lejn l-aħħar tal-artiklu se nuri kif nikkriptaġġ il-password.

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

Varjabbli huma stabbiliti fil-playbooks bl-użu ta 'ċingi kaboċċi doppji.

Aħna se nindikaw il-valuri tal-varjabbli fil-fajl tal-inventarju:

123.123.123.123

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

Oqgħod attent għad-direttiva [all:vars] - tgħid li l-blokk ta' test li jmiss huwa varjabbli (vars) u huma applikabbli għall-hosts kollha (kollha).

Id-disinn huwa wkoll interessanti "{{ user_password | password_hash('sha512') }}". Il-ħaġa hija li ansible ma jinstallax l-utent permezz user_add bħalma tagħmel dan manwalment. U jiffranka d-data kollha direttament, u huwa għalhekk li rridu wkoll nikkonverti l-password f'hash bil-quddiem, li huwa dak li jagħmel dan il-kmand.

Ejja nżidu l-utent tagħna mal-grupp sudo. Madankollu, qabel dan irridu niżguraw li tali grupp jeżisti għax ħadd mhu se jagħmel dan għalina:

---
- 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"

Kollox huwa pjuttost sempliċi, għandna wkoll modulu tal-grupp għall-ħolqien ta 'gruppi, b'sintassi simili ħafna għal apt. Imbagħad huwa biżżejjed li tirreġistra dan il-grupp lill-utent (groups: "sudo").
Huwa utli wkoll li żżid ċavetta ssh ma' dan l-utent sabiex inkunu nistgħu nilloggjaw nużawha mingħajr password:

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

F'dan il-każ, id-disinn huwa interessanti "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" — tikkopja l-kontenut tal-fajl id_rsa.pub (ismek jista’ jkun differenti), jiġifieri, il-parti pubblika taċ-ċavetta ssh u ttella’ fil-lista ta’ ċwievet awtorizzati għall-utent fuq is-server.

Rwoli

It-tliet kompiti kollha għall-ħolqien tal-użu jistgħu faċilment jiġu kklassifikati fi grupp wieħed ta 'kompiti, u tkun idea tajba li taħżen dan il-grupp separatament mill-playbook prinċipali sabiex ma jikberx wisq. Għal dan il-għan, Ansible għandu rwoli.
Skont l-istruttura tal-fajls indikata fil-bidu nett, ir-rwoli għandhom jitqiegħdu f'direttorju tar-rwoli separat, għal kull rwol hemm direttorju separat bl-istess isem, ġewwa l-kompiti, fajls, mudelli, eċċ direttorju
Ejja noħolqu struttura tal-fajl: ./ansible/roles/user/tasks/main.yml (prinċipali huwa l-fajl ewlieni li se jiġi mgħobbi u esegwit meta rwol ikun imqabbad mal-playbook; fajls oħra ta 'rwoli jistgħu jiġu konnessi miegħu). Issa tista 'tittrasferixxi l-kompiti kollha relatati mal-utent għal dan il-fajl:

# 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

Fil-playbook prinċipali, trid tispeċifika li tuża r-rwol tal-utent:

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

Ukoll, jista 'jagħmel sens li taġġorna s-sistema qabel il-kompiti l-oħra kollha; biex tagħmel dan, tista' tibdel l-isem tal-blokk tasks li fihom huma definiti fi pre_tasks.

Twaqqif ta 'nginx

Għandu diġà jkollna Nginx installat; irridu nikkonfigurawh u nħaddmuh. Ejja nagħmluha mill-ewwel fir-rwol. Ejja noħolqu struttura tal-fajl:

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

Issa għandna bżonn fajls u mudelli. Id-differenza bejniethom hija li ansible tikkopja l-fajls direttament, kif inhu. U l-mudelli għandu jkollhom l-estensjoni j2 u jistgħu jużaw valuri varjabbli billi jużaw l-istess ċineg kaboċċi doppji.

Ejja nippermettu nginx in main.yml fajl. Għal dan għandna modulu systemd:

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

Hawnhekk aħna mhux biss ngħidu li nginx għandu jinbeda (jiġifieri, innieduh), iżda immedjatament ngħidu li għandu jkun attivat.
Issa ejja nikkopja l-fajls tal-konfigurazzjoni:

# 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'

Aħna noħolqu l-fajl ewlieni tal-konfigurazzjoni nginx (tista 'teħodha direttament mis-server, jew tikteb it yourself). U wkoll il-fajl tal-konfigurazzjoni għall-applikazzjoni tagħna fid-direttorju sites_available (dan mhux meħtieġ iżda utli). Fl-ewwel każ, nużaw il-modulu tal-kopja biex nikkopja fajls (il-fajl irid ikun fih /ansible/roles/nginx/files/nginx.conf). Fit-tieni, nikkopjaw il-mudell, nissostitwixxu l-valuri tal-varjabbli. Il-mudell għandu jkun ġewwa /ansible/roles/nginx/templates/my_app.j2). U jista 'jidher xi ħaġa bħal din:

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 }};
  ....
}

Oqgħod attent għall-inserzjonijiet {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} — dawn huma l-varjabbli kollha li l-valuri tagħhom Ansible se jissostitwixxu fil-mudell qabel l-ikkupjar. Dan huwa utli jekk tuża playbook għal gruppi differenti ta 'hosts. Pereżempju, nistgħu nżidu l-fajl tal-inventarju tagħna:

[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

Jekk issa nniedu l-playbook tagħna, se twettaq il-kompiti speċifikati għaż-żewġ hosts. Iżda fl-istess ħin, għal staging host, il-varjabbli se jkunu differenti minn dawk tal-produzzjoni, u mhux biss fir-rwoli u l-playbooks, iżda wkoll f'nginx configs. {{ inventory_hostname }} m'għandhomx għalfejn jiġu speċifikati fil-fajl tal-inventarju - dan varjabbli speċjali anżibbli u l-host li għalih il-playbook qed jaħdem bħalissa huwa maħżun hemmhekk.
Jekk trid li jkollok fajl ta 'inventarju għal diversi hosts, iżda taħdem għal grupp wieħed biss, dan jista' jsir bil-kmand li ġej:

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

Għażla oħra hija li jkun hemm fajls ta 'inventarju separati għal gruppi differenti. Jew tista 'tgħaqqad iż-żewġ approċċi jekk għandek ħafna hosts differenti.

Ejja mmorru lura għat-twaqqif ta 'nginx. Wara li nikkupjaw il-fajls tal-konfigurazzjoni, irridu noħolqu symlink f'sitest_enabled għal my_app.conf minn sites_available. U erġa ibda 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

Hawnhekk kollox huwa sempliċi - għal darb'oħra moduli ansible b'sintassi pjuttost standard. Iżda hemm punt wieħed. M'hemm l-ebda skop li terġa 'tibda nginx kull darba. Innotajt li aħna ma niktbux kmandi bħal: "agħmel dan bħal dan", is-sintassi tidher aktar bħal "dan għandu jkollu dan l-istat". U ħafna drabi dan huwa eżattament kif jaħdem ansible. Jekk il-grupp diġà jeżisti, jew il-pakkett tas-sistema huwa diġà installat, allura ansible se jiċċekkja għal dan u taqbeż il-kompitu. Barra minn hekk, il-fajls ma jiġux ikkupjati jekk jaqblu kompletament ma' dak li diġà jinsab fuq is-server. Nistgħu nieħdu vantaġġ minn dan u nibdew nginx biss jekk il-fajls tal-konfigurazzjoni jkunu ġew mibdula. Hemm direttiva dwar ir-reġistru għal dan:

# 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

Jekk jinbidel wieħed mill-fajls tal-konfigurazzjoni, issir kopja u l-varjabbli tiġi rreġistrata restart_nginx. U biss jekk din il-varjabbli tkun ġiet irreġistrata li s-servizz jerġa 'jinbeda.

U, ovvjament, trid iżżid ir-rwol nginx mal-playbook prinċipali.

Twaqqif ta' postgresql

Irridu nippermettu postgresql bl-użu ta 'systemd bl-istess mod kif għamilna ma' nginx, u wkoll noħolqu utent li se nużaw biex jaċċessaw id-database u d-database nnifisha.
Ejja noħolqu rwol /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 }}"

Mhux se niddeskrivi kif inżid varjabbli fl-inventarju, dan diġà sar ħafna drabi, kif ukoll is-sintassi tal-moduli postgresql_db u postgresql_user. Aktar informazzjoni tinsab fid-dokumentazzjoni. L-aktar direttiva interessanti hawnhekk hija become_user: postgres. Il-fatt hu li b'mod awtomatiku, l-utent tal-postgres biss għandu aċċess għad-database postgresql u lokalment biss. Din id-direttiva tippermettilna nwettqu kmandi f'isem dan l-utent (jekk ikollna aċċess, ovvjament).
Ukoll, jista 'jkollok iżżid linja ma' pg_hba.conf biex tippermetti aċċess utent ġdid għad-database. Dan jista 'jsir bl-istess mod kif biddilna l-konfigurazzjoni nginx.

U ovvjament, għandek bżonn iżżid ir-rwol postgresql mal-playbook prinċipali.

L-installazzjoni ta’ ruby ​​permezz ta’ rbenv

Ansible m'għandux moduli biex jaħdem ma 'rbenv, iżda huwa installat billi tikklona repożitorju git. Għalhekk, din il-problema ssir l-aktar waħda mhux standard. Ejja noħolqu rwol għaliha /ansible/roles/ruby_rbenv/main.yml u ejja nibdew nimlewh:

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

Aħna nerġgħu nużaw id-direttiva become_user biex naħdmu taħt l-utent li ħloqna għal dawn l-għanijiet. Peress li rbenv huwa installat fid-direttorju tad-dar tiegħu, u mhux globalment. U nużaw ukoll il-modulu git biex nikklonu r-repożitorju, billi nispeċifikaw repo u dest.

Sussegwentement, irridu nirreġistraw rbenv init f'bashrc u nżidu rbenv ma' PATH hemmhekk. Għal dan għandna l-modulu 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 -)"'

Imbagħad għandek bżonn tinstalla ruby_build:

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

U finalment installa ruby. Dan isir permezz ta' rbenv, jiġifieri sempliċement bil-kmand 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

Ngħidu liema kmand tesegwixxi u b’liema. Madankollu, hawn niltaqgħu mal-fatt li ansible ma jmexxix il-kodiċi li jinsab f'bashrc qabel ma jmexxi l-kmandi. Dan ifisser li rbenv ikollu jiġi definit direttament fl-istess skript.

Il-problema li jmiss hija dovuta għall-fatt li l-kmand tal-qoxra m'għandu l-ebda stat mil-lat ansible. Jiġifieri, mhux se jkun hemm kontroll awtomatiku jekk din il-verżjoni ta 'ruby hijiex installata jew le. Nistgħu nagħmlu dan aħna stess:

- 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

Li jibqa 'huwa li tinstalla bundler:

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

U għal darb'oħra, żid ir-rwol tagħna ruby_rbenv mal-playbook prinċipali.

Fajls maqsuma.

B'mod ġenerali, is-setup jista 'jitlesta hawn. Sussegwentement, dak kollu li jibqa 'huwa li tħaddem capistrano u tikkopja l-kodiċi innifsu, toħloq id-direttorji meħtieġa u tniedi l-applikazzjoni (jekk kollox ikun ikkonfigurat b'mod korrett). Madankollu, capistrano spiss jeħtieġ fajls ta 'konfigurazzjoni addizzjonali, bħal database.yml jew .env Jistgħu jiġu kkupjati bħal fajls u mudelli għal nginx. Hemm sottilità waħda biss. Qabel ma tikkopja l-fajls, trid toħloq struttura tad-direttorju għalihom, xi ħaġa bħal din:

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

aħna nispeċifikaw direttorju wieħed biss u ansible awtomatikament joħloq dawk ġenitur jekk meħtieġ.

Ansible Vault

Diġà ltqajna mal-fatt li l-varjabbli jista 'jkun fihom dejta sigrieta bħall-password tal-utent. Jekk inti ħloqt .env fajl għall-applikazzjoni, u database.yml allura għandu jkun hemm saħansitra aktar data kritika bħal din. Ikun tajjeb li taħbihom minn għajnejhom. Għal dan il-għan huwa użat kaxxa-forti ansible.

Ejja noħolqu fajl għall-varjabbli /ansible/vars/all.yml (hawnhekk tista 'toħloq fajls differenti għal gruppi differenti ta' hosts, bħal fil-fajl tal-inventarju: production.yml, staging.yml, eċċ).
Il-varjabbli kollha li jridu jiġu encrypted għandhom jiġu trasferiti għal dan il-fajl bl-użu tas-sintassi standard tal-yml:

# 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

Wara dan il-fajl jista 'jiġi encrypted bil-kmand:

ansible-vault encrypt ./vars/all.yml

Naturalment, meta tikkodifika, ser ikollok bżonn tissettja password għad-deċifrar. Tista 'tara x'se jkun ġewwa l-fajl wara li ċċempel dan il-kmand.

Permezz ta ' ansible-vault decrypt il-fajl jista 'jiġi decrypted, modifikat u mbagħad ikkodifikat mill-ġdid.

M'għandekx bżonn tiddekripta l-fajl biex taħdem. Int taħżenha kriptata u tmexxi l-playbook bl-argument --ask-vault-pass. Ansible se jitlob il-password, jirkupra l-varjabbli, u jesegwixxi l-kompiti. Id-dejta kollha se tibqa' kriptata.

Il-kmand komplut għal diversi gruppi ta 'hosts u kaxxa-forti ansible se jidher xi ħaġa bħal din:

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

Imma mhux se ntik it-test sħiħ tal-playbooks u r-rwoli, ikteb it yourself. Minħabba li ansible huwa hekk - jekk ma tifhimx x'għandu jsir, allura mhux se tagħmel dan għalik.

Sors: www.habr.com

Żid kumment