Pirms neilga laika man vajadzÄja uzrakstÄ«t vairÄkas Ansible rokasgrÄmatas, lai sagatavotu serveri Rails lietojumprogrammas izvietoÅ”anai. Un, pÄrsteidzoÅ”i, es neatradu vienkÄrÅ”u soli pa solim rokasgrÄmatu. Es negribÄju kopÄt kÄda cita rokasgrÄmatu, nesaprotot, kas notiek, un galu galÄ man bija jÄizlasa dokumentÄcija, visu savÄcot paÅ”am. VarbÅ«t es kÄdam varu palÄ«dzÄt paÄtrinÄt Å”o procesu, izmantojot Å”o rakstu.
Vispirms ir jÄsaprot, ka ansible nodroÅ”ina Ärtu saskarni, lai veiktu iepriekÅ” noteiktu darbÄ«bu sarakstu attÄlajÄ serverÄ«, izmantojot SSH. Å eit nav nekÄdas burvÄ«bas, jÅ«s nevarat instalÄt spraudni un iegÅ«t lietojumprogrammas izvietoÅ”anu bez dÄ«kstÄves, izmantojot dokstaciju, uzraudzÄ«bu un citus jaukumus. Lai rakstÄ«tu rokasgrÄmatu, jums jÄzina, ko tieÅ”i vÄlaties darÄ«t un kÄ to izdarÄ«t. TÄpÄc mani neapmierina gatavas GitHub rokasgrÄmatas vai raksti, piemÄram: āKopÄt un palaist, tas darbosies.ā
Kas mums vajadzīgs?
KÄ jau teicu, lai uzrakstÄ«tu rokasgrÄmatu, ir jÄzina, ko un kÄ darÄ«t. Izlemsim, kas mums vajadzÄ«gs. Rails lietojumprogrammai mums bÅ«s nepiecieÅ”amas vairÄkas sistÄmas pakotnes: nginx, postgresql (redis utt.). TurklÄt mums ir nepiecieÅ”ama Ä«paÅ”a rubÄ«na versija. VislabÄk to instalÄt caur rbenv (rvm, asdf...). To visu palaist kÄ root lietotÄjam vienmÄr ir slikta ideja, tÄpÄc ir jÄizveido atseviŔķs lietotÄjs un jÄkonfigurÄ viÅa tiesÄ«bas. PÄc tam jums ir jÄaugÅ”upielÄdÄ mÅ«su kods serverÄ«, jÄkopÄ nginx, postgres utt. konfigurÄcijas un jÄuzsÄk visi Å”ie pakalpojumi.
RezultÄtÄ darbÄ«bu secÄ«ba ir Å”Äda:
- Piesakieties kÄ root
- instalÄt sistÄmas pakotnes
- izveidot jaunu lietotÄju, konfigurÄt tiesÄ«bas, ssh atslÄgu
- konfigurÄjiet sistÄmas pakotnes (nginx utt.) un palaidiet tÄs
- MÄs izveidojam lietotÄju datu bÄzÄ (jÅ«s varat uzreiz izveidot datu bÄzi)
- Piesakieties kÄ jauns lietotÄjs
- InstalÄjiet rbenv un ruby
- KomplektÄtÄja uzstÄdÄ«Å”ana
- Lietojumprogrammas koda augÅ”upielÄde
- Puma servera palaiŔana
TurklÄt pÄdÄjos posmus var veikt, izmantojot capistrano, vismaz no kastes var kopÄt kodu izlaiduma direktorijos, pÄrslÄgt laidienu ar simbolu pÄc veiksmÄ«gas izvietoÅ”anas, kopÄt konfigurÄcijas no koplietotÄ direktorija, restartÄt puma utt. To visu var izdarÄ«t, izmantojot Ansible, bet kÄpÄc?
Failu struktūra
Ansible ir stingrs
VienkÄrÅ”a rokasgrÄmata
Playbook ir yml fails, kas, izmantojot Ä«paÅ”u sintaksi, apraksta, kas un kÄ Ansible jÄdara. Izveidosim pirmo rokasgrÄmatu, kas neko nedara:
---
- name: Simple playbook
hosts: all
Å eit mÄs vienkÄrÅ”i sakÄm, ka mÅ«su rokasgrÄmata saucas Simple Playbook
un ka tÄ saturs ir jÄizpilda visiem saimniekiem. MÄs varam to saglabÄt /ansible direktorijÄ ar nosaukumu playbook.yml
un mÄÄ£ini skriet:
ansible-playbook ./playbook.yml
PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched
Ansible saka, ka nezina nevienu saimniekdatoru, kas atbilstu visu sarakstu. Tie ir jÄnorÄda Ä«paÅ”Ä sarakstÄ
Izveidosim to tajÄ paÅ”Ä iespÄjamajÄ direktorijÄ:
123.123.123.123
TÄdÄ veidÄ mÄs vienkÄrÅ”i norÄdÄm resursdatoru (ideÄlÄ gadÄ«jumÄ mÅ«su VPS resursdatoru testÄÅ”anai, vai arÄ« varat reÄ£istrÄt localhost) un saglabÄjam to ar nosaukumu inventory
.
Varat mÄÄ£inÄt palaist ansible, izmantojot uzskaites failu:
ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
PLAY RECAP ************************************************************************************************************************************
Ja jums ir ssh piekļuve norÄdÄ«tajam resursdatoram, ansible izveidos savienojumu un apkopos informÄciju par attÄlo sistÄmu. (noklusÄjuma UZDEVUMS [Faktu apkopoÅ”ana]), pÄc kura tas sniegs Ä«su ziÅojumu par izpildi (PLAY RECAP).
PÄc noklusÄjuma savienojumam tiek izmantots lietotÄjvÄrds, ar kuru esat pieteicies sistÄmÄ. VisticamÄk, tas nebÅ«s saimniekdatorÄ. RokasgrÄmatas failÄ varat norÄdÄ«t, kuru lietotÄju izmantot, lai izveidotu savienojumu, izmantojot direktÄ«vu remote_user. ArÄ« informÄcija par attÄlo sistÄmu jums bieži var bÅ«t nevajadzÄ«ga, un jums nevajadzÄtu tÄrÄt laiku tÄs apkopoÅ”anai. Å o uzdevumu var arÄ« atspÄjot:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
MÄÄ£iniet vÄlreiz palaist rokasgrÄmatu un pÄrliecinieties, vai savienojums darbojas. (Ja norÄdÄ«jÄt root lietotÄju, tad, lai iegÅ«tu paaugstinÄtas tiesÄ«bas, ir jÄnorÄda arÄ« direktÄ«va tapti: true. KÄ rakstÄ«ts dokumentÄcijÄ: become set to ātrueā/āyesā to activate privilege escalation.
lai gan nav lÄ«dz galam skaidrs, kÄpÄc).
VarbÅ«t jÅ«s saÅemsit kļūdu, ko izraisa fakts, ka ansible nevar noteikt Python tulku, tad varat to norÄdÄ«t manuÄli:
ansible_python_interpreter: /usr/bin/python3
JÅ«s varat uzzinÄt, kur jums ir python, izmantojot komandu whereis python
.
SistÄmas pakotÅu instalÄÅ”ana
Ansible standarta izplatÄ«Å”anÄ ir iekļauti daudzi moduļi darbam ar dažÄdÄm sistÄmas pakotnÄm, tÄpÄc mums nav jÄraksta bash skripti jebkÄda iemesla dÄļ. Tagad mums ir nepiecieÅ”ams viens no Å”iem moduļiem, lai atjauninÄtu sistÄmu un instalÄtu sistÄmas pakotnes. ManÄ VPS ir Ubuntu Linux, tÄpÄc es izmantoju pakotÅu instalÄÅ”anai apt-get
Šø
PapildinÄsim mÅ«su rokasgrÄmatu ar pirmajiem uzdevumiem:
---
- 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
Uzdevums ir tieÅ”i tas uzdevums, ko Ansible veiks attÄlajos serveros. MÄs pieŔķiram uzdevumam nosaukumu, lai mÄs varÄtu izsekot tÄ izpildei žurnÄlÄ. Un mÄs aprakstÄm, izmantojot konkrÄta moduļa sintaksi, kas tam jÄdara. Å ajÄ gadÄ«jumÄ apt: update_cache=yes
- saka atjauninÄt sistÄmas pakotnes, izmantojot apt moduli. OtrÄ komanda ir nedaudz sarežģītÄka. MÄs nododam pakotÅu sarakstu apt modulim un sakÄm, ka tÄs ir state
vajadzÄtu kļūt present
, tas ir, mÄs sakÄm, ka instalÄjiet Ŕīs pakotnes. LÄ«dzÄ«gÄ veidÄ mÄs varam likt viÅiem tos dzÄst vai atjauninÄt, vienkÄrÅ”i mainot state
. LÅ«dzu, Åemiet vÄrÄ, ka, lai sliedes darbotos ar postgresql, mums ir nepiecieÅ”ama pakotne postgresql-contrib, kuru mÄs tagad instalÄjam. Atkal, jums tas jÄzina un jÄdara; ansible viens pats to nedarÄ«s.
MÄÄ£iniet vÄlreiz palaist rokasgrÄmatu un pÄrbaudiet, vai pakotnes ir instalÄtas.
Jaunu lietotÄju izveide.
Lai strÄdÄtu ar lietotÄjiem, Ansible ir arÄ« modulis - lietotÄjs. Pievienosim vÄl vienu uzdevumu (jau zinÄmÄs rotaļu grÄmatas daļas paslÄpu aiz komentÄriem, lai katru reizi nepÄrkopÄtu to pilnÄ«bÄ):
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: my_user
shell: /bin/bash
password: "{{ 123qweasd | password_hash('sha512') }}"
MÄs izveidojam jaunu lietotÄju, iestatÄm tam shell un paroli. Un tad mÄs saskaramies ar vairÄkÄm problÄmÄm. Ko darÄ«t, ja dažÄdu saimniekdatoru lietotÄjvÄrdiem ir jÄbÅ«t atŔķirÄ«giem? Un paroles glabÄÅ”ana skaidrÄ tekstÄ rokasgrÄmatÄ ir ļoti slikta ideja. SÄkumÄ ievadÄ«sim lietotÄjvÄrdu un paroli mainÄ«gajos, un raksta beigÄs es parÄdÄ«Å”u, kÄ Å”ifrÄt paroli.
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
MainÄ«gie lielumi tiek iestatÄ«ti rokasgrÄmatÄs, izmantojot dubultÄs cirtainÄs figÅ«riekavas.
MÄs norÄdÄ«sim mainÄ«go vÄrtÄ«bas inventarizÄcijas failÄ:
123.123.123.123
[all:vars]
user=my_user
user_password=123qweasd
LÅ«dzu, Åemiet vÄrÄ direktÄ«vu [all:vars]
- tas saka, ka nÄkamais teksta bloks ir mainÄ«gie (vari) un tie ir piemÄrojami visiem saimniekiem (visiem).
Arī dizains ir interesants "{{ user_password | password_hash('sha512') }}"
. Lieta tÄda, ka ansible neinstalÄ lietotÄju caur user_add
tÄpat kÄ jÅ«s to darÄ«tu manuÄli. Un tas saglabÄ visus datus tieÅ”i, tÄpÄc mums ir arÄ« iepriekÅ” jÄpÄrvÄrÅ” parole par jaucÄjkodu, ko Ŕī komanda dara.
Pievienosim savu lietotÄju sudo grupai. TomÄr pirms tam mums ir jÄpÄrliecinÄs, ka Å”Äda grupa pastÄv, jo neviens to mÅ«su vietÄ nedarÄ«s:
---
- 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"
Viss ir pavisam vienkÄrÅ”i, mums ir arÄ« grupu modulis grupu izveidei, kura sintaksi ļoti lÄ«dzinÄs apt. Tad pietiek reÄ£istrÄt Å”o grupu lietotÄjam (groups: "sudo"
).
Ir arÄ« noderÄ«gi Å”im lietotÄjam pievienot ssh atslÄgu, lai mÄs varÄtu pieteikties, izmantojot to bez paroles:
---
- 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
Å ajÄ gadÄ«jumÄ dizains ir interesants "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
ā tas kopÄ faila id_rsa.pub saturu (jÅ«su vÄrds var atŔķirties), tas ir, ssh atslÄgas publisko daļu un augÅ”upielÄdÄ to lietotÄja autorizÄto atslÄgu sarakstÄ serverÄ«.
Lomas
Visus trÄ«s lietojuma izveides uzdevumus var viegli klasificÄt vienÄ uzdevumu grupÄ, un bÅ«tu ieteicams Å”o grupu glabÄt atseviŔķi no galvenÄs rokasgrÄmatas, lai tÄ neizaugtu pÄrÄk liela. Å im nolÅ«kam Ansible ir
AtbilstoÅ”i paÅ”Ä sÄkumÄ norÄdÄ«tajai faila struktÅ«rai lomas jÄievieto atseviÅ”Ä·Ä lomu direktorijÄ, katrai lomai ir atseviŔķs direktorijs ar tÄdu paÅ”u nosaukumu, iekÅ”Ä uzdevumu, failu, veidÅu utt direktorijÄ
Izveidosim faila struktūru: ./ansible/roles/user/tasks/main.yml
(galvenais ir galvenais fails, kas tiks ielÄdÄts un izpildÄ«ts, kad loma ir pievienota rokasgrÄmatai; tai var pievienot citus lomu failus). Tagad visus ar lietotÄju saistÄ«tos uzdevumus varat pÄrsÅ«tÄ«t uz Å”o failu:
# 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
GalvenajÄ rokasgrÄmatÄ ir jÄnorÄda, lai izmantotu lietotÄja lomu:
---
- 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
TÄpat var bÅ«t lietderÄ«gi atjauninÄt sistÄmu pirms visiem citiem uzdevumiem; lai to izdarÄ«tu, varat pÄrdÄvÄt bloku tasks
kurÄ tie ir definÄti pre_tasks
.
Notiek nginx iestatīŔana
Mums jau vajadzÄtu bÅ«t instalÄtam Nginx; mums tas ir jÄkonfigurÄ un jÄpalaiž. DarÄ«sim to uzreiz lomÄ. Izveidosim faila struktÅ«ru:
- ansible
- roles
- nginx
- files
- tasks
- main.yml
- templates
Tagad mums ir nepiecieÅ”ami faili un veidnes. AtŔķirÄ«ba starp tiem ir tÄda, ka ansible kopÄ failus tieÅ”i tÄdus, kÄdi tie ir. Un veidnÄm ir jÄbÅ«t j2 paplaÅ”inÄjumam, un tÄs var izmantot mainÄ«gas vÄrtÄ«bas, izmantojot tÄs paÅ”as dubultÄs krokainÄs figÅ«riekavas.
IespÄjosim nginx main.yml
failu. Å im nolÅ«kam mums ir sistÄmas modulis:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
Å eit mÄs ne tikai sakÄm, ka nginx ir jÄsÄk (tas ir, mÄs to palaižam), bet mÄs uzreiz sakÄm, ka tas ir jÄiespÄjo.
Tagad kopÄsim konfigurÄcijas failus:
# 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'
MÄs izveidojam galveno nginx konfigurÄcijas failu (varat to Åemt tieÅ”i no servera vai uzrakstÄ«t pats). Un arÄ« mÅ«su lietojumprogrammas konfigurÄcijas fails direktorijÄ sites_available (tas nav nepiecieÅ”ams, bet noderÄ«gs). PirmajÄ gadÄ«jumÄ mÄs izmantojam kopÄÅ”anas moduli, lai kopÄtu failus (failam jÄbÅ«t iekÅ”Ä /ansible/roles/nginx/files/nginx.conf
). OtrajÄ mÄs nokopÄjam veidni, aizstÄjot mainÄ«go vÄrtÄ«bas. Veidnei jÄbÅ«t iekÅ”Ä /ansible/roles/nginx/templates/my_app.j2
). Un tas varÄtu izskatÄ«ties apmÄram Å”Ädi:
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 }};
....
}
PievÄrsiet uzmanÄ«bu ieliktÅiem {{ app_name }}
, {{ app_path }}
, {{ server_name }}
, {{ inventory_hostname }}
ā tie ir visi mainÄ«gie, kuru vÄrtÄ«bas Ansible aizstÄs veidnÄ pirms kopÄÅ”anas. Tas ir noderÄ«gi, ja izmantojat rokasgrÄmatu dažÄdÄm saimnieku grupÄm. PiemÄram, mÄs varam pievienot mÅ«su inventÄra failu:
[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
Ja mÄs tagad palaižam savu rokasgrÄmatu, tÄ veiks norÄdÄ«tos uzdevumus abiem saimniekiem. Bet tajÄ paÅ”Ä laikÄ iestudÄjuma saimniekam mainÄ«gie atŔķirsies no ražoÅ”anas mainÄ«gajiem, un ne tikai lomÄs un rotaļu grÄmatÄs, bet arÄ« nginx konfigurÄcijÄs. {{ inventory_hostname }}
nav jÄnorÄda inventarizÄcijas failÄ - Å”is
Ja vÄlaties, lai inventÄra fails bÅ«tu vairÄkiem saimniekiem, bet tas darbotos tikai vienai grupai, to var izdarÄ«t ar Å”Ädu komandu:
ansible-playbook -i inventory ./playbook.yml -l "staging"
VÄl viena iespÄja ir izveidot atseviŔķus inventÄra failus dažÄdÄm grupÄm. Vai arÄ« varat apvienot abas pieejas, ja jums ir daudz dažÄdu saimniekdatoru.
AtgriezÄ«simies pie nginx iestatÄ«Å”anas. PÄc konfigurÄcijas failu kopÄÅ”anas mums ir jÄizveido saite vietnÄ sitest_enabled uz my_app.conf no vietnes sites_available. Un restartÄjiet 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
Å eit viss ir vienkÄrÅ”i - atkal pieejami moduļi ar diezgan standarta sintaksi. Bet ir viens punkts. Nav jÄgas katru reizi restartÄt nginx. Vai esat ievÄrojuÅ”i, ka mÄs nerakstÄm tÄdas komandas kÄ: ādari to Å”Ädiā, sintakse vairÄk izskatÄs pÄc āÅ”im vajadzÄtu bÅ«t Å”im stÄvoklimā. Un visbiežÄk tieÅ”i tÄ darbojas ansible. Ja grupa jau pastÄv vai sistÄmas pakotne jau ir instalÄta, ansible to pÄrbaudÄ«s un izlaidÄ«s uzdevumu. ArÄ« faili netiks kopÄti, ja tie pilnÄ«bÄ sakrÄ«t ar to, kas jau atrodas serverÄ«. MÄs varam izmantot Å”o iespÄju un restartÄt nginx tikai tad, ja ir mainÄ«ti konfigurÄcijas faili. Å im nolÅ«kam ir reÄ£istra direktÄ«va:
# 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
Ja mainÄs kÄds no konfigurÄcijas failiem, tiks izveidota kopija un mainÄ«gais tiks reÄ£istrÄts restart_nginx
. Un tikai tad, ja Å”is mainÄ«gais ir reÄ£istrÄts, pakalpojums tiks restartÄts.
Un, protams, galvenajai rokasgrÄmatai jÄpievieno nginx loma.
Postgresql iestatīŔana
Mums ir jÄiespÄjo postgresql, izmantojot systemd tÄpat kÄ nginx, kÄ arÄ« jÄizveido lietotÄjs, kuru izmantosim, lai piekļūtu datubÄzei un paÅ”ai datubÄzei.
Izveidosim lomu /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 }}"
NeaprakstÄ«Å”u, kÄ inventÄram pievienot mainÄ«gos, tas jau ir darÄ«ts daudzas reizes, kÄ arÄ« postgresql_db un postgresql_user moduļu sintaksi. VairÄk informÄcijas var atrast dokumentÄcijÄ. Å eit ir visinteresantÄkÄ direktÄ«va become_user: postgres
. Fakts ir tÄds, ka pÄc noklusÄjuma tikai postgres lietotÄjam ir piekļuve postgresql datubÄzei un tikai lokÄli. Å Ä« direktÄ«va ļauj mums izpildÄ«t komandas Ŕī lietotÄja vÄrdÄ (ja mums, protams, ir piekļuve).
TÄpat, iespÄjams, failam pg_hba.conf bÅ«s jÄpievieno rindiÅa, lai ļautu jaunam lietotÄjam piekļūt datu bÄzei. To var izdarÄ«t tÄpat kÄ mÄs mainÄ«jÄm nginx konfigurÄciju.
Un, protams, galvenajai rokasgrÄmatai jÄpievieno postgresql loma.
RubÄ«na instalÄÅ”ana caur rbenv
Ansible nav moduļu darbam ar rbenv, bet tas tiek instalÄts, klonÄjot git repozitoriju. TÄpÄc Ŕī problÄma kļūst par visnestandarta problÄmu. Izveidosim viÅai lomu /ansible/roles/ruby_rbenv/main.yml
un sÄksim to aizpildÄ«t:
# Install rbenv and ruby
- name: Install rbenv
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv
MÄs atkal izmantojam direktÄ«vu kļūt_lietotÄjs, lai strÄdÄtu zem lietotÄja, ko izveidojÄm Å”iem nolÅ«kiem. TÄ kÄ rbenv ir instalÄts tÄ mÄjas direktorijÄ, nevis globÄli. Un mÄs arÄ« izmantojam git moduli, lai klonÄtu repozitoriju, norÄdot repo un dest.
TÄlÄk mums ir jÄreÄ£istrÄ rbenv init programmÄ bashrc un jÄpievieno rbenv uz PATH. Å im nolÅ«kam mums ir lineinfile modulis:
- 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 -)"'
PÄc tam jums jÄinstalÄ ruby_build:
- name: Install ruby-build
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build
Un visbeidzot instalÄjiet rubÄ«nu. Tas tiek darÄ«ts, izmantojot rbenv, tas ir, vienkÄrÅ”i ar bash komandu:
- name: Install ruby
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
rbenv install {{ ruby_version }}
args:
executable: /bin/bash
MÄs sakÄm, kuru komandu un ar ko izpildÄ«t. TomÄr Å”eit mÄs saskaramies ar faktu, ka ansible pirms komandu palaiÅ”anas nepalaiž bashrc ietverto kodu. Tas nozÄ«mÄ, ka rbenv bÅ«s jÄdefinÄ tieÅ”i tajÄ paÅ”Ä skriptÄ.
NÄkamÄ problÄma ir saistÄ«ta ar faktu, ka Äaulas komandai nav stÄvokļa no iespÄjamÄ viedokļa. Tas nozÄ«mÄ, ka netiks veikta automÄtiska pÄrbaude, vai Ŕī rubÄ«na versija ir instalÄta vai nav. To varam izdarÄ«t paÅ”i:
- 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
Atliek tikai instalÄt komplektÄtÄju:
- name: Install bundler
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
gem install bundler
Un atkal pievienojiet mÅ«su lomu ruby_rbenv galvenajai rokasgrÄmatai.
Koplietotie faili.
KopumÄ iestatÄ«Å”anu varÄtu pabeigt Å”eit. TÄlÄk atliek tikai palaist capistrano, un tas pats nokopÄs kodu, izveidos nepiecieÅ”amos direktorijus un palaiž lietojumprogrammu (ja viss ir pareizi konfigurÄts). TomÄr capistrano bieži vien ir nepiecieÅ”ami papildu konfigurÄcijas faili, piemÄram, database.yml
vai .env
Tos var kopÄt tÄpat kÄ nginx failus un veidnes. Ir tikai viens smalkums. Pirms failu kopÄÅ”anas jums ir jÄizveido tiem direktoriju struktÅ«ra, piemÄram:
# Copy shared files for deploy
- name: Ensure shared dir
become_user: "{{ user }}"
file:
path: "{{ app_path }}/shared/config"
state: directory
mÄs norÄdÄm tikai vienu direktoriju, un ansible automÄtiski izveidos vecÄku direktorijus, ja nepiecieÅ”ams.
Ansible Vault
MÄs jau esam saskÄruÅ”ies ar faktu, ka mainÄ«gie var saturÄt slepenus datus, piemÄram, lietotÄja paroli. Ja esat izveidojis .env
pieteikuma fails un database.yml
tad tÄdu kritisku datu jÄbÅ«t vÄl vairÄk. BÅ«tu labi tos paslÄpt no ziÅkÄrÄ«go acÄ«m. Å im nolÅ«kam to izmanto
Izveidosim failu mainīgajiem /ansible/vars/all.yml
(Å”eit jÅ«s varat izveidot dažÄdus failus dažÄdÄm saimniekdatoru grupÄm, tÄpat kÄ inventÄra failÄ: production.yml, staging.yml utt.).
Visi mainÄ«gie, kas jÄÅ”ifrÄ, ir jÄpÄrsÅ«ta uz Å”o failu, izmantojot standarta yml sintaksi:
# 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
PÄc tam Å”o failu var Å”ifrÄt ar komandu:
ansible-vault encrypt ./vars/all.yml
Protams, Å”ifrÄjot, jums bÅ«s jÄiestata parole atÅ”ifrÄÅ”anai. PÄc Ŕīs komandas izsaukÅ”anas varat redzÄt, kas bÅ«s failÄ.
Ar ansible-vault decrypt
failu var atÅ”ifrÄt, modificÄt un pÄc tam vÄlreiz Å”ifrÄt.
Lai darbotos, fails nav jÄatÅ”ifrÄ. JÅ«s to saglabÄjat Å”ifrÄtÄ veidÄ un palaižat rokasgrÄmatu ar argumentu --ask-vault-pass
. Ansible pieprasÄ«s paroli, izgÅ«s mainÄ«gos un izpildÄ«s uzdevumus. Visi dati paliks Å”ifrÄti.
PilnÄ«ga komanda vairÄkÄm saimniekdatoru grupÄm un ansible Vault izskatÄ«sies apmÄram Å”Ädi:
ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
Bet es jums nesniegÅ”u pilnu grÄmatu un lomu tekstu, rakstiet to pats. Jo ansible ir tÄ - ja tu nesaproti, kas jÄdara, tad tas tavÄ vietÄ to nedarÄ«s.
Avots: www.habr.com