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:
- Idħol bħala root
- tinstalla pakketti tas-sistema
- toħloq utent ġdid, ikkonfigura d-drittijiet, ċavetta ssh
- kkonfigurat pakketti tas-sistema (nginx eċċ) u mexxihom
- Aħna noħolqu utent fid-database (tista 'minnufih toħloq database)
- Idħol bħala utent ġdid
- Installa rbenv u ruby
- Installazzjoni tal-bundler
- Tlugħ tal-kodiċi tal-applikazzjoni
- 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
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
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
и
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
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
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
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