Nyetél server pikeun nyebarkeun aplikasi Rails nganggo Ansible

Teu lila pisan kuring diperlukeun nulis sababaraha playbooks Ansible nyiapkeun server pikeun deploying hiji aplikasi rel. Sareng, heran, kuring henteu mendakan manual léngkah-léngkah anu saderhana. Kuring teu hayang nyalin playbook batur tanpa ngarti naon anu lumangsung, sarta dina tungtungna kuring kudu maca dokuméntasi, ngumpulkeun sagalana sorangan. Panginten abdi tiasa ngabantosan batur nyepetkeun prosés ieu kalayan bantosan tulisan ieu.

Hal kahiji anu kedah dipikahartos nyaéta yén ansible nyayogikeun anjeun antarbeungeut anu gampang pikeun ngalakukeun daptar tindakan anu tos siap dina server jauh (s) via SSH. Henteu aya sihir di dieu, anjeun moal tiasa masang plugin sareng nampi panyebaran enol downtime tina aplikasi anjeun sareng docker, monitoring sareng barang-barang sanés tina kotak. Pikeun nulis playbook, anjeun kedah terang naon anu anjeun hoyong laksanakeun sareng kumaha cara ngalakukeunana. Éta sababna kuring henteu sugema ku playbook anu siap-siap ti GitHub, atanapi tulisan sapertos: "Salin sareng jalankeun, éta bakal tiasa dianggo."

Urang peryogi naon?

Sakumaha anu kuring parantos nyarios, pikeun nyerat playbook anjeun kedah terang naon anu anjeun hoyong laksanakeun sareng kumaha cara ngalakukeunana. Hayu urang mutuskeun naon urang kudu. Pikeun aplikasi Rails urang peryogi sababaraha pakét sistem: nginx, postgresql (redis, jsb). Sajaba ti éta, urang peryogi versi husus tina Ruby. Hadé pisan mun éta masang ngaliwatan rbenv (rvm, asdf...). Ngajalankeun sadayana ieu salaku pangguna root mangrupikeun ide anu goréng, janten anjeun kedah nyiptakeun pangguna anu misah sareng ngonpigurasikeun hakna. Saatos ieu, anjeun kedah unggah kode kami ka server, nyalin configs pikeun nginx, postgres, jsb sareng ngamimitian sadaya jasa ieu.

Hasilna, runtuyan tindakan nyaéta kieu:

  1. Login salaku root
  2. masang pakét sistem
  3. nyieun pamaké anyar, ngonpigurasikeun hak, konci ssh
  4. ngonpigurasikeun bungkusan sistem (nginx jsb) sareng ngajalankeunana
  5. Urang nyieun pamaké dina database (anjeun bisa langsung nyieun database a)
  6. Login salaku pamaké anyar
  7. Pasang rbenv sareng Ruby
  8. Pamasangan bundler
  9. Unggah kode aplikasi
  10. Ngajalankeun server Puma

Sumawona, tahapan terakhir tiasa dilakukeun nganggo capistrano, sahenteuna tina kotak éta tiasa nyalin kode kana diréktori pelepasan, ngalihkeun sékrési kalayan symlink nalika panyebaran suksés, nyalin konfigurasi tina diréktori anu dibagi, balikan deui puma, jsb. Sadaya ieu tiasa dilakukeun nganggo Ansible, tapi naha?

Struktur file

Ansible gaduh ketat struktur file pikeun sakabéh file anjeun, jadi leuwih sae pikeun nyimpen eta sadayana dina diréktori misah. Leuwih ti éta, teu jadi penting naha éta bakal di aplikasi rel sorangan, atawa misah. Anjeun tiasa nyimpen file dina gudang git misah. Pribadi, kuring mendakan anu paling merenah pikeun nyiptakeun diréktori anu tiasa diréktori dina / config diréktori aplikasi rel sareng nyimpen sadayana dina hiji gudang.

Playbook basajan

Playbook mangrupikeun file yml anu, nganggo sintaksis khusus, ngajelaskeun naon anu kedah dilakukeun ku Ansible sareng kumaha. Hayu urang nyieun playbook munggaran nu teu nanaon:

---
- name: Simple playbook
  hosts: all

Di dieu urang ngan nyebutkeun yén playbook urang disebut Simple Playbook sarta yén eusina kudu dieksekusi pikeun sakabéh sarwa. Urang tiasa nyimpen dina / ansible diréktori kalayan nami playbook.yml jeung cobaan ngajalankeun:

ansible-playbook ./playbook.yml

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

Ansible nyarios yén éta henteu terang host anu cocog sareng sadaya daptar. Maranéhanana kudu didaptarkeun dina husus file inventaris.

Hayu urang nyieun dina diréktori ansible sarua:

123.123.123.123

Ieu kumaha urang ngan saukur nangtukeun host (idealna host VPS kami pikeun nguji, atanapi anjeun tiasa ngadaptar localhost) sareng simpen dina nami. inventory.
Anjeun tiasa nyobian ngajalankeun ansible sareng file inventaris:

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

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

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

Upami anjeun gaduh aksés ssh ka host anu ditangtukeun, maka ansible bakal nyambung sareng ngumpulkeun inpormasi ngeunaan sistem jauh. (TUGAS standar [Kumpulkeun Fakta]) saatos éta bakal masihan laporan pondok ngeunaan palaksanaan (MAIN RECAP).

Sacara standar, sambungan nganggo nami pangguna dimana anjeun asup kana sistem. Paling dipikaresep moal on host. Dina file playbook, anjeun tiasa netepkeun pangguna mana anu dianggo pikeun nyambungkeun nganggo diréktif remote_user. Ogé, inpormasi ngeunaan sistem jauh tiasa sering henteu dipikabutuh pikeun anjeun sareng anjeun henteu kedah miceunan waktos pikeun ngumpulkeun éta. Tugas ieu ogé tiasa ditumpurkeun:

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

Coba jalankeun playbook deui sareng pastikeun sambunganna jalan. (Upami anjeun netepkeun pangguna root, anjeun ogé kedah netepkeun janten: diréktif leres pikeun kéngingkeun hak anu luhur. Sakumaha anu diserat dina dokuméntasi: become set to ‘true’/’yes’ to activate privilege escalation. sanajan teu sagemblengna jelas naha).

Panginten anjeun bakal nampi kasalahan anu disababkeun ku kanyataan yén ansible henteu tiasa nangtukeun juru Python, teras anjeun tiasa netepkeun sacara manual:

ansible_python_interpreter: /usr/bin/python3 

Anjeun tiasa mendakan dimana anjeun gaduh python kalayan paréntah whereis python.

Masang pakét sistem

Distribusi standar Ansible kalebet seueur modul pikeun damel sareng sababaraha pakét sistem, janten urang henteu kedah nyerat skrip bash pikeun alesan naon. Ayeuna urang peryogi salah sahiji modul ieu pikeun ngapdet sistem sareng masang bungkusan sistem. Kuring boga Linux Ubuntu on VPS kuring, jadi masang bungkusan kuring make apt-get и modul pikeun eta. Upami Anjeun keur make sistem operasi béda, mangka anjeun bisa jadi kudu modul béda (inget, ceuk kuring di awal urang kudu nyaho sateuacanna naon jeung kumaha urang bakal ngalakukeun). Nanging, sintaksisna sigana bakal sami.

Hayu urang ngalengkepan playbook urang ku tugas munggaran:

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

Tugas mangrupikeun tugas anu bakal dilakukeun ku Ansible dina server jauh. Kami masihan tugas nami supados urang tiasa ngalacak palaksanaanna dina log. Sareng kami ngajelaskeun, ngagunakeun sintaksis modul khusus, naon anu kedah dilakukeun. Dina hal ieu apt: update_cache=yes - nyebutkeun pikeun ngapdet bungkusan sistem ngagunakeun modul apt. Paréntah kadua rada pajeulit. Urang lulus daptar bungkusan ka modul apt sarta nyebutkeun yén éta téh state kedah janten present, nyaeta, urang nyebutkeun install bungkusan ieu. Dina cara anu sami, urang tiasa nyarioskeun aranjeunna ngahapus aranjeunna, atanapi ngapdet ku ngan saukur ngarobih state. Punten dicatet yén pikeun rel tiasa dianggo sareng postgresql kami peryogi pakét postgresql-contrib, anu kami pasang ayeuna. Sakali deui, anjeun kedah terang sareng ngalakukeun ieu; ansible nyalira moal ngalakukeun ieu.

Coba ngajalankeun playbook deui jeung pariksa yen bungkusan nu geus dipasang.

Nyieun pamaké anyar.

Pikeun damel sareng pangguna, Ansible ogé gaduh modul - pangguna. Hayu urang tambahkeun hiji deui tugas (kuring nyumputkeun bagian anu parantos dipikanyaho tina playbook di tukangeun koméntar supados henteu nyalin sadayana unggal waktos):

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

Urang nyieun pamaké anyar, Nyetél schell sarta sandi pikeun eta. Lajeng urang ngajalankeun kana sababaraha masalah. Kumaha upami nami pangguna kedah béda pikeun host anu béda? Sareng nyimpen kecap akses dina téks anu jelas dina playbook mangrupikeun ide anu goréng. Pikeun mimitian, hayu urang nempatkeun nami pangguna sareng kecap konci kana variabel, sareng nuju tungtung tulisan kuring bakal nunjukkeun kumaha cara énkripsi kecap konci.

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

Variabel diatur dina playbooks ngagunakeun braces Curly ganda.

Kami bakal nunjukkeun nilai-nilai variabel dina file inventaris:

123.123.123.123

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

Perhatikeun diréktif [all:vars] - eta nyebutkeun yén blok salajengna téks nyaéta variabel (vars) sarta aranjeunna lumaku pikeun sakabéh host (sadayana).

Desain ogé metot "{{ user_password | password_hash('sha512') }}". Hal éta ansible teu install pamaké via user_add kawas anjeun ngalakukeunana sacara manual. Sareng nyimpen sadaya data sacara langsung, naha éta urang ogé kedah ngarobih kecap konci sateuacanna janten hash, anu mangrupikeun paréntah ieu.

Hayu urang tambahkeun pangguna urang kana grup sudo. Nanging, sateuacan ieu urang kedah mastikeun yén grup sapertos kitu aya sabab teu aya anu bakal ngalakukeun ieu pikeun urang:

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

Sagalana cukup basajan, urang ogé boga modul grup pikeun nyieun grup, kalawan sintaksis pisan sarupa apt. Maka cukup pikeun ngadaptar grup ieu ka pangguna (groups: "sudo").
Éta ogé kapaké pikeun nambihan konci ssh ka pangguna ieu supados urang tiasa log in nganggo éta tanpa kecap konci:

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

Dina hal ieu, desain metot "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" — eta nyalin eusi file id_rsa.pub (ngaran anjeun bisa jadi béda), nyaeta, bagian umum tina konci ssh jeung unggah ka daptar kenop otorisasi pikeun pamaké dina server.

Kalungguhan

Katiluna pancén pikeun nyieun pamakéan harese digolongkeun kana hiji grup tugas, sarta eta bakal jadi mangrupakeun ide nu sae pikeun nyimpen grup ieu misah ti playbook utama meh teu tumuwuh badag teuing. Pikeun tujuan ieu, Ansible gaduh kalungguhan.
Numutkeun struktur file anu dituduhkeun di awal, peran kedah ditempatkeun dina diréktori peran anu kapisah, pikeun tiap peran aya diréktori anu misah sareng nami anu sami, di jero tugas, file, témplat, jsb diréktori.
Hayu urang nyieun struktur file: ./ansible/roles/user/tasks/main.yml (utama nyaéta file utama anu bakal dimuat sareng dieksekusi nalika peran dihubungkeun sareng playbook; file peran sanésna tiasa dihubungkeun sareng éta). Ayeuna anjeun tiasa nransper sadaya tugas anu aya hubunganana sareng pangguna kana file ieu:

# 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

Dina playbook utama, anjeun kudu nangtukeun ngagunakeun peran pamaké:

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

Ogé, éta tiasa masuk akal pikeun ngapdet sistem sateuacan sadaya tugas sanés; pikeun ngalakukeun ieu, anjeun tiasa ngaganti ngaran blok tasks di mana maranéhna dihartikeun dina pre_tasks.

Nyetél nginx

Urang kedah parantos dipasang Nginx; urang kedah ngonpigurasikeun sareng ngajalankeunana. Hayu urang ngalakukeun eta langsung dina peran. Hayu urang nyieun struktur file:

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

Ayeuna urang peryogi file sareng témplat. Beda antara aranjeunna nyaéta yén ansible nyalin file langsung, sapertos kitu. Sareng témplat kedah gaduh ekstensi j2 sareng aranjeunna tiasa nganggo nilai variabel nganggo kurung keriting ganda anu sami.

Hayu urang aktipkeun nginx main.yml berkas. Pikeun ieu kami gaduh modul systemd:

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

Di dieu urang henteu ngan ukur nyarios yén nginx kedah dimimitian (nyaéta, urang ngaluncurkeunana), tapi urang langsung nyarios yén éta kedah diaktipkeun.
Ayeuna hayu urang nyalin file konfigurasi:

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

Kami nyiptakeun file konfigurasi nginx utama (anjeun tiasa nyandak langsung tina server, atanapi nyerat nyalira). Sareng ogé file konfigurasi pikeun aplikasi kami dina diréktori sites_available (ieu teu perlu tapi mangpaat). Dina kasus anu pertama, kami nganggo modul salinan pikeun nyalin file (file kedah aya dina /ansible/roles/nginx/files/nginx.conf). Dina kadua, urang nyalin témplat, ngagantikeun nilai-nilai variabel. Citakan kedah aya dina /ansible/roles/nginx/templates/my_app.j2). Sareng sigana sapertos kieu:

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

Nengetan sisipan {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} — Ieu mangrupikeun variabel anu nilaina Ansible bakal ngagentos kana citakan sateuacan nyalin. Ieu mangpaat lamun make playbook pikeun grup béda tina host. Salaku conto, urang tiasa nambihan file inventaris urang:

[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

Upami urang ayeuna ngaluncurkeun playbook urang, éta bakal ngalaksanakeun tugas anu ditangtukeun pikeun duanana host. Tapi dina waktos anu sareng, pikeun host pementasan, variabel bakal béda ti anu produksi, sareng henteu ngan ukur dina peran sareng playbooks, tapi ogé dina konfigurasi nginx. {{ inventory_hostname }} teu perlu dieusian dina file inventory - ieu variabel ansible husus sareng host anu playbook ayeuna dijalankeun disimpen di dinya.
Upami anjeun hoyong gaduh file inventaris pikeun sababaraha host, tapi ngan ukur ngajalankeun pikeun hiji grup, ieu tiasa dilakukeun ku paréntah di handap ieu:

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

Pilihan séjén nyaéta gaduh file inventaris anu misah pikeun grup anu béda. Atanapi anjeun tiasa ngagabungkeun dua pendekatan upami anjeun gaduh seueur host anu béda.

Hayu urang balik deui ka nyetel nginx. Sanggeus nyalin file konfigurasi, urang kudu nyieun symlink di sitest_enabled mun my_app.conf ti sites_available. Sareng balikan deui 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

Sadayana saderhana di dieu - deui modul ansible sareng sintaksis anu cukup standar. Tapi aya hiji titik. Henteu aya gunana pikeun ngamimitian deui nginx unggal waktos. Naha anjeun perhatikeun yén kami henteu nyerat paréntah sapertos: "ngalakukeun ieu sapertos kieu", sintaksisna langkung mirip "ieu kedah gaduh kaayaan ieu". Jeung paling sering ieu persis kumaha ansible jalan. Upami grupna parantos aya, atanapi pakét sistem parantos dipasang, maka ansible bakal mariksa ieu sareng ngalangkungan tugas. Ogé, file moal disalin upami aranjeunna leres-leres cocog sareng anu parantos aya dina server. Urang tiasa ngamangpaatkeun ieu sareng balikan deui nginx ngan upami file konfigurasi parantos dirobih. Aya diréktif ngadaptar pikeun ieu:

# 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

Upami salah sahiji file konfigurasi robih, salinan bakal dilakukeun sareng variabelna bakal kadaptar restart_nginx. Sareng upami variabel ieu parantos kadaptar, jasa éta bakal dibalikan deui.

Sareng, tangtosna, anjeun kedah nambihan peran nginx kana playbook utama.

Nyetél postgresql

Urang kedah ngaktipkeun postgresql nganggo systemd dina cara anu sami sareng nginx, sareng ogé nyiptakeun pangguna anu bakal kami anggo pikeun ngaksés pangkalan data sareng pangkalan data éta sorangan.
Hayu urang nyieun peran /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 }}"

Kuring moal ngajelaskeun kumaha carana nambahkeun variabel kana inventory, ieu geus dipigawé sababaraha kali, kitu ogé sintaksis tina postgresql_db na postgresql_user modul. Inpo nu leuwih lengkep bisa kapanggih dina dokuméntasi. Diréktif anu paling narik di dieu nyaéta become_user: postgres. Kanyataanna nyaéta sacara standar, ngan ukur pangguna postgres anu gaduh aksés kana database postgresql sareng ngan sacara lokal. Diréktif ieu ngamungkinkeun urang pikeun ngaéksekusi paréntah atas nama pamaké ieu (lamun urang boga aksés, tangtu).
Ogé, anjeun bisa jadi kudu nambahkeun hiji garis ka pg_hba.conf pikeun ngidinan hiji aksés pamaké anyar kana database. Ieu tiasa dilakukeun ku cara anu sami sareng urang ngarobih konfigurasi nginx.

Sareng tangtosna, anjeun kedah nambihan peran postgresql kana playbook utama.

Masang Ruby via rbenv

Ansible teu boga modul pikeun gawé bareng rbenv, tapi geus dipasang ku kloning Repository git. Ku alatan éta, masalah ieu janten paling non-standar. Hayu urang nyiptakeun peran pikeun anjeunna /ansible/roles/ruby_rbenv/main.yml sareng hayu urang ngamimitian ngeusianana:

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

Urang deui make diréktif jadi_user pikeun digawé di handapeun pamaké kami dijieun pikeun tujuan ieu. Kusabab rbenv dipasang dina diréktori imah na, sarta henteu global. Sarta kami ogé ngagunakeun modul git pikeun clone Repository nu, nangtukeun repo na dest.

Salajengna, urang kedah ngadaptar rbenv init di bashrc tur nambahkeun rbenv ka PATH dinya. Pikeun ieu kami gaduh modul 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 -)"'

Teras anjeun kedah pasang ruby_build:

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

Sarta pamustunganana install ruby. Hal ieu dilakukeun ku rbenv, nyaéta, ngan ukur nganggo paréntah 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

Kami nyarioskeun paréntah anu kedah dieksekusi sareng naon. Nanging, di dieu urang mendakan kanyataan yén ansible henteu ngajalankeun kode anu aya dina bashrc sateuacan ngajalankeun paréntah. Ieu ngandung harti yén rbenv kudu dihartikeun langsung dina Aksara sarua.

Masalah salajengna disababkeun ku kanyataan yén paréntah cangkang teu gaduh kaayaan tina sudut pandang anu ansible. Hartina, moal aya pamariksaan otomatis naha versi Ruby ieu dipasang atanapi henteu. Urang tiasa ngalakukeun ieu sorangan:

- 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

Sadaya anu tetep nyaéta masang bundler:

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

Jeung deui, tambahkeun ruby_rbenv peran urang ka playbook utama.

file dibagikeun.

Sacara umum, setelan tiasa réngsé di dieu. Salajengna, sadaya anu tetep nyaéta ngajalankeun capistrano sareng éta bakal nyalin kodeu sorangan, nyiptakeun diréktori anu diperyogikeun sareng ngaluncurkeun aplikasina (upami sadayana dikonpigurasi leres). Sanajan kitu, capistrano mindeng merlukeun file konfigurasi tambahan, kayaning database.yml atawa .env Éta tiasa disalin sapertos file sareng témplat pikeun nginx. Aya ngan hiji subtlety. Sateuacan nyalin file, anjeun kedah nyiptakeun struktur diréktori pikeun aranjeunna, sapertos kieu:

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

urang tangtukeun ngan hiji diréktori jeung ansible bakal otomatis nyieun leuwih kolot lamun perlu.

Kolong Ansible

Kami parantos mendakan kanyataan yén variabel tiasa ngandung data rahasia sapertos kecap akses pangguna. Lamun geus dijieun .env file pikeun aplikasi, jeung database.yml teras kedah aya data anu langkung kritis sapertos kitu. Éta hadé pikeun nyumputkeun aranjeunna tina panon prying. Pikeun tujuan ieu dipaké kolong ansible.

Hayu urang nyieun file pikeun variabel /ansible/vars/all.yml (Di dieu anjeun bisa nyieun file béda pikeun grup béda tina host, kawas dina file inventory: production.yml, staging.yml, jsb).
Sadaya variabel anu kedah énkripsi kedah ditransfer kana file ieu nganggo sintaksis yml standar:

# 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

Saatos éta file ieu tiasa énkripsi kalayan paréntah:

ansible-vault encrypt ./vars/all.yml

Alami, nalika énkripsi, anjeun kedah nyetél kecap konci pikeun dekripsi. Anjeun tiasa ningali naon anu aya di jero file saatos nelepon paréntah ieu.

ku ansible-vault decrypt file bisa decrypted, dirobah lajeng énkripsi deui.

Anjeun teu kedah ngadekrip file pikeun jalan. Anjeun nyimpen énkripsi sarta ngajalankeun playbook kalawan argumen --ask-vault-pass. Ansible bakal naroskeun kecap konci, nyandak variabel, sareng ngalaksanakeun tugas. Sadaya data bakal tetep énkripsi.

Paréntah lengkep pikeun sababaraha grup host sareng kolong ansible bakal katingali sapertos kieu:

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

Tapi kuring moal masihan anjeun téks lengkep ngeunaan playbook sareng peran, nyerat nyalira. Kusabab ansible sapertos kitu - upami anjeun henteu ngartos naon anu kedah dilakukeun, maka éta moal ngalakukeun pikeun anjeun.

sumber: www.habr.com

Tambahkeun komentar