Pag-configure sa usa ka Server aron I-deploy ang usa ka Rails Application Gamit ang Ansible

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:

  1. Login isip gamut
  2. i-install ang mga pakete sa sistema
  3. paghimo og bag-ong user, i-configure ang mga katungod, ssh key
  4. i-configure ang mga pakete sa sistema (nginx etc) ug padagana kini
  5. Naghimo kami usa ka tiggamit sa database (mahimo ka dayon nga maghimo usa ka database)
  6. Login isip bag-ong user
  7. I-install ang rbenv ug ruby
  8. Pag-instalar sa bundler
  9. Pag-upload sa code sa aplikasyon
  10. 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 istruktura sa file alang sa tanan nimong mga file, mao nga labing maayo nga ibutang kini tanan sa usa ka lahi nga direktoryo. Dugang pa, dili kaayo hinungdanon kung kini naa sa aplikasyon sa riles mismo, o gilain. Mahimo nimong tipigan ang mga file sa usa ka separado nga git repository. Sa personal, akong nakit-an nga labing sayon ​​​​ang paghimo og usa ka ansible nga direktoryo sa / config nga direktoryo sa aplikasyon sa riles ug ibutang ang tanan sa usa ka repositoryo.

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 file sa imbentaryo.

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 и module alang niini. Kung naggamit ka usa ka lahi nga operating system, nan tingali kinahanglan nimo ang usa ka lahi nga module (hinumdomi, giingon ko sa sinugdanan nga kinahanglan naton mahibal-an daan kung unsa ug kung giunsa naton buhaton). Bisan pa, ang syntax lagmit parehas.

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 mga papel.
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 espesyal nga ansible variable ug ang host diin ang playbook karon nagdagan gitipigan didto.
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 ansible nga vault.

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

Idugang sa usa ka comment