Dili pa lang dugay kinahanglan nako nga magsulat daghang mga Ansible nga playbook aron maandam ang server alang sa pag-deploy sa aplikasyon sa Rails. Ug, katingad-an, wala ako nakit-an nga usa ka yano nga lakang sa lakang nga manwal. Dili ko gusto nga kopyahon ang playbook sa uban nga wala makasabut kung unsa ang nanghitabo, ug sa katapusan kinahanglan nako nga basahon ang dokumentasyon, gikolekta ang tanan sa akong kaugalingon. Tingali makatabang ko sa usa ka tawo nga mapadali kini nga proseso sa tabang niini nga artikulo.
Ang una nga butang nga masabtan mao nga ang ansible naghatag kanimo usa ka kombenyente nga interface aron mahimo ang usa ka gitakda nang daan nga lista sa mga aksyon sa (mga) hilit nga server pinaagi sa SSH. Wala’y salamangka dinhi, dili ka maka-install usa ka plugin ug makakuha usa ka zero downtime nga pag-deploy sa imong aplikasyon nga adunay docker, pag-monitor ug uban pang mga butang nga wala sa kahon. Aron makasulat usa ka playbook, kinahanglan nimo mahibal-an kung unsa gyud ang gusto nimo buhaton ug kung giunsa kini buhaton. Mao nga wala ako matagbaw sa andam na nga mga playbook gikan sa GitHub, o mga artikulo sama sa: "Kopya ug dagan, kini molihok."
Unsay atong gikinahanglan?
Sama sa giingon ko na, aron makasulat usa ka playbook kinahanglan nimo mahibal-an kung unsa ang gusto nimo buhaton ug kung giunsa kini buhaton. Atong hukman kon unsay atong gikinahanglan. Alang sa aplikasyon sa Rails magkinahanglan kami og daghang mga pakete sa sistema: nginx, postgresql (redis, etc). Dugang pa, kinahanglan namon ang usa ka piho nga bersyon sa ruby. Labing maayo nga i-install kini pinaagi sa rbenv (rvm, asdf...). Ang pagpadagan sa tanan niini ingon usa ka gamut nga tiggamit kanunay usa ka dili maayo nga ideya, busa kinahanglan nimo nga maghimo usa ka lahi nga tiggamit ug i-configure ang iyang mga katungod. Pagkahuman niini, kinahanglan nimo nga i-upload ang among code sa server, kopyaha ang mga config para sa nginx, postgres, ug uban pa ug sugdi ang tanan niini nga mga serbisyo.
Ingon usa ka sangputanan, ang pagkasunod-sunod sa mga aksyon mao ang mosunod:
- Login isip gamut
- i-install ang mga pakete sa sistema
- paghimo og bag-ong user, i-configure ang mga katungod, ssh key
- i-configure ang mga pakete sa sistema (nginx etc) ug padagana kini
- Naghimo kami usa ka tiggamit sa database (mahimo ka dayon nga maghimo usa ka database)
- Login isip bag-ong user
- I-install ang rbenv ug ruby
- Pag-instalar sa bundler
- Pag-upload sa code sa aplikasyon
- Paglunsad sa Puma server
Dugang pa, ang katapusan nga mga yugto mahimo’g gamit ang capistrano, labing menos sa gawas sa kahon mahimo’g kopyahon ang code sa mga direktoryo sa pagpagawas, ibalhin ang pagpagawas gamit ang usa ka symlink sa malampuson nga pag-deploy, pagkopya sa mga config gikan sa usa ka gipaambit nga direktoryo, i-restart ang puma, ug uban pa. Mahimo kining tanan gamit ang Ansible, apan ngano?
Istruktura sa file
Ang Ansible adunay estrikto
Yano nga Playbook
Ang Playbook usa ka yml file nga, gamit ang espesyal nga syntax, naghulagway kung unsa ang kinahanglan buhaton sa Ansible ug kung giunsa. Himoon nato ang unang playbook nga walay mahimo:
---
- name: Simple playbook
hosts: all
Dinhi lang ta moingon nga ang atong playbook gitawag Simple Playbook
ug nga ang mga sulod niini kinahanglan nga ipatuman alang sa tanan nga mga panon. Mahimo namon kini i-save sa / ansible nga direktoryo nga adunay ngalan playbook.yml
ug pagsulay sa pagdagan:
ansible-playbook ./playbook.yml
PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched
Giingon ni Ansible nga wala kini nahibal-an nga bisan unsang mga host nga motakdo sa tanan nga lista. Kinahanglang ilista sila sa usa ka espesyal
Himoon nato kini sa samang ansible nga direktoryo:
123.123.123.123
Ingon niini kung giunsa namon ipiho ang host (mas maayo ang host sa among VPS alang sa pagsulay, o mahimo ka magparehistro localhost) ug i-save kini sa ilawom sa ngalan inventory
.
Mahimo nimong sulayan ang pagpadagan sa usa ka file sa imbentaryo:
ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
PLAY RECAP ************************************************************************************************************************************
Kung ikaw adunay ssh nga pag-access sa gitakda nga host, unya ang ansible magkonektar ug mangolekta og kasayuran bahin sa hilit nga sistema. (default TASK [Pagtipon Mga Kamatuoran]) pagkahuman maghatag kini usa ka mubo nga taho sa pagpatay (PLAY RECAP).
Sa kasagaran, ang koneksyon naggamit sa username diin ikaw naka-log in sa sistema. Kini lagmit dili sa host. Sa playbook file, mahimo nimong ipiho kung kinsa nga user ang gamiton aron makonektar gamit ang remote_user nga direktiba. Usab, ang impormasyon bahin sa usa ka hilit nga sistema sa kasagaran dili kinahanglan kanimo ug dili ka mag-usik ug panahon sa pagkolekta niini. Kini nga buluhaton mahimo usab nga ma-disable:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
Sulayi pagpadagan pag-usab ang playbook ug siguroa nga ang koneksyon nagtrabaho. (Kung imong gipiho ang gamut nga tiggamit, nan kinahanglan nimo nga ipiho ang nahimo nga: tinuod nga direktiba aron makuha ang taas nga mga katungod. Ingon sa nahisulat sa dokumentasyon: become set to ‘true’/’yes’ to activate privilege escalation.
bisan kung dili kini hingpit nga klaro kung ngano).
Tingali makadawat ka usa ka sayup nga gipahinabo sa kamatuoran nga ang ansible dili makatino sa tighubad sa Python, unya mahimo nimo kini ipiho nga mano-mano:
ansible_python_interpreter: /usr/bin/python3
Mahimo nimong mahibal-an kung diin ka adunay python nga adunay mando whereis python
.
Pag-instalar sa mga pakete sa sistema
Ang sumbanan nga pag-apod-apod sa Ansible naglakip sa daghang mga module alang sa pagtrabaho sa lainlaing mga pakete sa sistema, mao nga dili kami kinahanglan nga magsulat sa mga script sa bash sa bisan unsang hinungdan. Karon kinahanglan namon ang usa niini nga mga module aron ma-update ang sistema ug i-install ang mga pakete sa sistema. Naa koy Ubuntu Linux sa akong VPS, aron ma-install ang mga pakete nga akong gigamit apt-get
и
Atong dugangan ang atong playbook sa unang mga buluhaton:
---
- 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
Ang buluhaton mao gyud ang tahas nga himuon sa Ansible sa hilit nga mga server. Gihatagan namo ang buluhaton og ngalan aron masubay namo ang pagpatuman niini sa log. Ug among gihulagway, gamit ang syntax sa usa ka piho nga module, kung unsa ang kinahanglan buhaton. Niini nga kaso apt: update_cache=yes
- nag-ingon nga i-update ang mga pakete sa sistema gamit ang apt module. Ang ikaduha nga sugo mao ang usa ka gamay nga mas komplikado. Gipasa namon ang usa ka lista sa mga pakete sa apt module ug giingon nga sila state
kinahanglan mahimong present
, kana mao, giingon namon nga i-install kini nga mga pakete. Sa susamang paagi, mahimo natong sultihan sila nga tangtangon kini, o i-update kini pinaagi lamang sa pagbag-o state
. Palihug timan-i nga para sa mga riles sa pagtrabaho uban sa postgresql kinahanglan namo ang postgresql-contrib package, nga among gi-install karon. Sa makausa pa, kinahanglan nimo nga mahibal-an ug buhaton kini; ang mahimo sa iyang kaugalingon dili makahimo niini.
Sulayi pagdagan pag-usab ang playbook ug susiha nga ang mga pakete na-install.
Paghimo bag-ong tiggamit.
Aron magtrabaho uban sa mga tiggamit, ang Ansible usab adunay usa ka module - user. Magdugang ta og usa pa ka buluhaton (Gitago nako ang nahibal-an na nga mga bahin sa playbook luyo sa mga komentaryo aron dili kini kopyahon sa tanan matag higayon):
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: my_user
shell: /bin/bash
password: "{{ 123qweasd | password_hash('sha512') }}"
Naghimo kami usa ka bag-ong tiggamit, nagbutang usa ka schell ug password alang niini. Ug unya makasinati kami daghang mga problema. Unsa kaha kung ang mga username kinahanglan nga lahi alang sa lainlaing mga host? Ug ang pagtipig sa password sa tin-aw nga teksto sa playbook usa ka dili maayo nga ideya. Sa pagsugod, ibutang nato ang username ug password ngadto sa mga variable, ug ngadto sa katapusan sa artikulo akong ipakita kung unsaon pag-encrypt ang password.
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
Gibutang ang mga variable sa mga playbook gamit ang dobleng kulot nga braces.
Atong ipakita ang mga kantidad sa mga variable sa file sa imbentaryo:
123.123.123.123
[all:vars]
user=my_user
user_password=123qweasd
Palihug timan-i ang direktiba [all:vars]
- kini nag-ingon nga ang sunod nga block sa teksto mao ang mga variable (vars) ug kini magamit sa tanan nga mga host (tanan).
Makaiikag usab ang disenyo "{{ user_password | password_hash('sha512') }}"
. Ang butang mao nga ang ansible wala mag-install sa user pinaagi sa user_add
sama nga buhaton nimo kini nga mano-mano. Ug gitipigan niini ang tanan nga mga datos nga direkta, mao nga kinahanglan naton usab nga i-convert ang password nga usa ka hash nga daan, nga mao ang gibuhat sa kini nga mando.
Atong idugang ang atong user sa sudo nga grupo. Bisan pa, sa wala pa kini kinahanglan naton sigurohon nga adunay ingon nga grupo tungod kay wala’y usa nga mobuhat niini alang kanato:
---
- 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"
Ang tanan yano ra, kami usab adunay usa ka module sa grupo alang sa paghimo og mga grupo, nga adunay usa ka syntax nga parehas sa apt. Unya igo na nga irehistro kini nga grupo sa tiggamit (groups: "sudo"
).
Mapuslanon usab ang pagdugang usa ka ssh nga yawe sa kini nga tiggamit aron kami maka-log in gamit kini nga wala’y 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
Sa kini nga kaso, ang disenyo makapaikag "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
— kini nagkopya sa mga sulod sa id_rsa.pub file (imong ngalan mahimong lahi), nga mao, ang publiko nga bahin sa ssh yawe ug upload niini ngadto sa listahan sa mga awtorisado yawe alang sa user sa server.
Mga Papel
Ang tanan nga tulo ka mga buluhaton alang sa paghimo sa paggamit dali nga maklasipikar sa usa ka grupo sa mga buluhaton, ug maayo nga ideya nga tipigan kini nga grupo nga gilain gikan sa main playbook aron dili kini modako. Alang niini nga katuyoan, ang Ansible adunay
Sumala sa istruktura sa file nga gipakita sa sinugdanan, ang mga tahas kinahanglan ibutang sa usa ka lahi nga direktoryo sa papel, alang sa matag papel adunay usa ka lahi nga direktoryo nga adunay parehas nga ngalan, sa sulod sa mga buluhaton, mga file, templates, etc nga direktoryo
Maghimo kita og istruktura sa file: ./ansible/roles/user/tasks/main.yml
(main mao ang nag-unang file nga ikarga ug ipatuman kung ang usa ka papel konektado sa playbook; ang ubang mga papel nga file mahimong konektado niini). Karon mahimo nimong ibalhin ang tanan nga mga buluhaton nga may kalabotan sa tiggamit sa kini nga file:
# 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
Sa nag-unang playbook, kinahanglan nimong ipiho nga gamiton ang tahas sa tiggamit:
---
- 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
Usab, mahimo’g makatarunganon nga i-update ang sistema sa wala pa ang tanan nga ubang mga buluhaton; aron mahimo kini, mahimo nimong ilisan ang ngalan sa block tasks
diin sila gihubit sa pre_tasks
.
Pag-set up sa nginx
Kinahanglan nga na-install na naton ang Nginx; kinahanglan naton nga i-configure kini ug ipadagan kini. Buhaton nato dayon sa papel. Maghimo kita og istruktura sa file:
- ansible
- roles
- nginx
- files
- tasks
- main.yml
- templates
Karon kinahanglan namon ang mga file ug mga template. Ang kalainan tali kanila mao nga ansible pagkopya sa mga file direkta, sama sa. Ug ang mga templates kinahanglan adunay j2 extension ug sila makagamit sa mga variable value gamit ang parehas nga double curly braces.
Atong palihokon ang nginx main.yml
file. Alang niini kami adunay usa ka systemd module:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
Dinhi dili lamang kita nag-ingon nga ang nginx kinahanglan nga sugdan (kana mao, atong ilunsad kini), apan kita moingon dayon nga kini kinahanglan nga mahimo.
Karon atong kopyahon ang mga file sa pag-configure:
# 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'
Gihimo namo ang nag-unang nginx configuration file (mahimo nimo kining kuhaon direkta gikan sa server, o isulat kini sa imong kaugalingon). Ug usab ang configuration file alang sa among aplikasyon sa sites_available directory (kini dili kinahanglan apan mapuslanon). Sa una nga kaso, gigamit namon ang module sa pagkopya sa pagkopya sa mga file (ang file kinahanglan nga naa sa /ansible/roles/nginx/files/nginx.conf
). Sa ikaduha, gikopya namon ang template, gipuli ang mga kantidad sa mga variable. Ang template kinahanglan nga naa /ansible/roles/nginx/templates/my_app.j2
). Ug kini mahimong tan-awon sama niini:
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 }};
....
}
Hatagi'g pagtagad ang mga insert {{ app_name }}
, {{ app_path }}
, {{ server_name }}
, {{ inventory_hostname }}
- kini ang tanan nga mga variable kansang mga kantidad ang Ansible ipuli sa template sa dili pa kopyahon. Mapuslanon kini kung mogamit ka usa ka playbook alang sa lainlaing mga grupo sa mga host. Pananglitan, mahimo namon idugang ang among file sa imbentaryo:
[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
Kung gilansad na namo ang among playbook, buhaton niini ang gitakda nga mga buluhaton alang sa duha ka host. Apan sa parehas nga oras, alang sa usa ka host sa dula, ang mga variable lahi sa mga produksiyon, ug dili lamang sa mga papel ug playbook, apan usab sa mga nginx configs. {{ inventory_hostname }}
dili kinahanglan nga espesipiko sa file sa imbentaryo - kini
Kung gusto nimo nga adunay usa ka file sa imbentaryo alang sa daghang mga host, apan modagan lamang alang sa usa ka grupo, mahimo kini gamit ang mosunud nga mando:
ansible-playbook -i inventory ./playbook.yml -l "staging"
Ang laing kapilian mao ang pagbaton ug bulag nga mga file sa imbentaryo alang sa lain-laing mga grupo. O mahimo nimong isagol ang duha nga mga pamaagi kung adunay daghang lainlaing mga host.
Balik ta sa pag set up sa nginx. Human makopya ang mga configuration file, kinahanglan namong maghimo ug symlink sa sitest_enabled sa my_app.conf gikan sa sites_available. Ug i-restart ang 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
Ang tanan yano dinhi - pag-usab ansible nga mga module nga adunay medyo standard syntax. Apan adunay usa ka punto. Wala’y kapuslanan nga i-restart ang nginx matag higayon. Namatikdan ba nimo nga wala kami magsulat og mga sugo sama sa: "buhata kini nga sama niini", ang syntax morag "kini kinahanglan nga adunay kini nga estado". Ug sa kasagaran mao gyud kini kung giunsa ang ansible molihok. Kung naa na ang grupo, o na-install na ang package sa sistema, susihon ni ansible ug laktawan ang buluhaton. Usab, ang mga file dili makopya kon sila hingpit nga motakdo sa unsay anaa na sa server. Mahimo natong pahimuslan kini ug i-restart ang nginx kung ang mga file sa pag-configure nausab. Adunay usa ka direktiba sa pagrehistro alang niini:
# 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
Kung ang usa sa mga file sa pag-configure mausab, usa ka kopya ang himuon ug ang variable marehistro restart_nginx
. Ug kung kini nga variable narehistro na nga ang serbisyo ma-restart.
Ug, siyempre, kinahanglan nimo nga idugang ang papel sa nginx sa main playbook.
Pag-set up sa postgresql
Kinahanglan namon nga magamit ang postgresql gamit ang systemd sa parehas nga paagi sama sa among gibuhat sa nginx, ug maghimo usab usa ka tiggamit nga among gamiton aron ma-access ang database ug ang database mismo.
Magbuhat ta ug papel /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 }}"
Dili nako ihulagway kung giunsa pagdugang ang mga variable sa imbentaryo, nahimo na kini sa daghang mga higayon, ingon man ang syntax sa postgresql_db ug postgresql_user modules. Dugang nga impormasyon makita sa dokumentasyon. Ang labing makapaikag nga direktiba dinhi mao become_user: postgres
. Ang kamatuoran mao nga pinaagi sa default, ang postgres user lamang ang adunay access sa postgresql database ug sa lokal lamang. Kini nga direktiba nagtugot kanamo sa pagpatuman sa mga sugo alang sa kini nga tiggamit (kung kami adunay access, siyempre).
Usab, mahimo nimong idugang ang usa ka linya sa pg_hba.conf aron tugotan ang bag-ong user nga maka-access sa database. Mahimo kini sa parehas nga paagi sama sa pagbag-o sa nginx config.
Ug siyempre, kinahanglan nimo nga idugang ang postgresql nga papel sa main playbook.
Pag-instalar sa ruby pinaagi sa rbenv
Ang Ansible walay mga module alang sa pagtrabaho sa rbenv, apan kini gi-install pinaagi sa pag-clone sa usa ka git repository. Busa, kini nga problema nahimong labing non-standard nga usa. Magbuhat ta ug papel para niya /ansible/roles/ruby_rbenv/main.yml
ug atong sugdan ang pagpuno niini:
# Install rbenv and ruby
- name: Install rbenv
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv
Gigamit na usab namo ang become_user nga direktiba aron magtrabaho ubos sa user nga among gibuhat alang niini nga mga katuyoan. Tungod kay ang rbenv na-install sa direktoryo sa balay niini, ug dili sa tibuuk kalibutan. Ug gigamit usab namo ang git module aron ma-clone ang repository, nga nagtino sa repo ug dest.
Sunod, kinahanglan natong irehistro ang rbenv init sa bashrc ug idugang ang rbenv sa PATH didto. Alang niini kita adunay lineinfile module:
- 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 -)"'
Unya kinahanglan nimo nga i-install ang ruby_build:
- name: Install ruby-build
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build
Ug sa katapusan i-install ang ruby. Gihimo kini pinaagi sa rbenv, nga mao, sa yano nga mando sa 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
Gisulti namon kung unsang mando ang ipatuman ug kung unsa. Bisan pa, dinhi atong makita ang kamatuoran nga ang ansible wala magpadagan sa code nga anaa sa bashrc sa wala pa ipadagan ang mga sugo. Kini nagpasabut nga ang rbenv kinahanglan nga ipasabut nga direkta sa parehas nga script.
Ang sunod nga problema tungod sa kamatuoran nga ang shell command walay estado gikan sa usa ka ansible nga punto sa panglantaw. Kana mao, wala’y awtomatikong pagsusi kung kini nga bersyon sa ruby na-install o wala. Mahimo nato kini sa atong kaugalingon:
- 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
Ang nahabilin mao ang pag-install sa bundler:
- name: Install bundler
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
gem install bundler
Ug usab, idugang ang among papel ruby_rbenv sa main playbook.
Gipaambit nga mga file.
Sa kinatibuk-an, ang pag-setup mahimong makompleto dinhi. Sunod, ang nahabilin mao ang pagpadagan sa capistrano ug kopyahon niini ang code mismo, paghimo sa gikinahanglan nga mga direktoryo ug ilunsad ang aplikasyon (kung ang tanan na-configure sa husto). Bisan pa, ang capistrano kanunay nanginahanglan dugang nga mga file sa pag-configure, sama sa database.yml
o .env
Mahimo silang kopyahon sama sa mga file ug templates alang sa nginx. Adunay usa lamang ka pagkamatinahuron. Sa dili pa kopyahon ang mga file, kinahanglan nimo nga maghimo usa ka istruktura sa direktoryo alang kanila, sama niini:
# Copy shared files for deploy
- name: Ensure shared dir
become_user: "{{ user }}"
file:
path: "{{ app_path }}/shared/config"
state: directory
usa ra ka direktoryo ang among gitakda ug ang ansible awtomatik nga maghimo ug mga ginikanan kung kinahanglan.
Ansible nga Vault
Nakakita na kami sa kamatuoran nga ang mga variables mahimong adunay sekreto nga datos sama sa password sa user. Kung nakabuhat ka .env
file alang sa aplikasyon, ug database.yml
nan kinahanglan nga adunay labi pa nga kritikal nga datos. Maayo unta nga itago sila gikan sa mga mata. Alang niini nga katuyoan kini gigamit
Magbuhat ta ug file para sa variables /ansible/vars/all.yml
(dinhi makahimo ka og lain-laing mga file para sa lain-laing mga grupo sa mga host, sama sa file sa imbentaryo: production.yml, staging.yml, etc).
Ang tanan nga mga variable nga kinahanglan ma-encrypt kinahanglan ibalhin sa kini nga file gamit ang standard yml syntax:
# 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
Pagkahuman niini nga file mahimong ma-encrypt gamit ang mando:
ansible-vault encrypt ./vars/all.yml
Natural, kung mag-encrypt, kinahanglan nimo nga magbutang usa ka password alang sa pag-decryption. Makita nimo kung unsa ang naa sa sulod sa file pagkahuman tawagan kini nga mando.
Uban sa tabang sa ansible-vault decrypt
ang file mahimong decrypted, usbon ug unya encrypted pag-usab.
Dili nimo kinahanglan nga i-decrypt ang file aron magtrabaho. Gitipigan nimo kini nga naka-encrypt ug gipadagan ang playbook nga adunay argumento --ask-vault-pass
. Mangayo si Ansible sa password, bawion ang mga variable, ug ipatuman ang mga buluhaton. Ang tanan nga datos magpabilin nga naka-encrypt.
Ang kompleto nga command alang sa daghang mga grupo sa mga host ug ansible vault mahimong sama niini:
ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
Apan dili ko ihatag kanimo ang tibuuk nga teksto sa mga playbook ug mga papel, isulat kini sa imong kaugalingon. Tungod kay ang ansible ingon niana - kung dili nimo masabtan kung unsa ang kinahanglan buhaton, nan dili kini mahimo alang kanimo.
Source: www.habr.com