Nyetel server kanggo masang aplikasi Rails nggunakake Ansible

Ora suwe aku kudu nulis sawetara playbook Ansible kanggo nyiapake server kanggo nggunakake aplikasi Rails. Lan, nggumunake, aku ora nemokake manual langkah-langkah sing gampang. Aku ora pengin nyalin playbook wong liya tanpa mangerteni apa sing kedadeyan, lan pungkasane aku kudu maca dokumentasi, ngumpulake kabeh dhewe. Mbok menawa aku bisa mbantu wong nyepetake proses iki kanthi bantuan artikel iki.

Wangsulan: Bab ingkang sapisanan mangertos iku ansible menehi sampeyan karo antarmuka trep kanggo nindakake dhaftar predefined saka tumindak ing server remot (s) liwat SSH. Ora ana sihir ing kene, sampeyan ora bisa nginstal plugin lan entuk panyebaran nol downtime aplikasi sampeyan kanthi docker, ngawasi lan barang-barang liyane sing metu saka kothak. Kanggo nulis playbook, sampeyan kudu ngerti persis apa sing arep ditindakake lan kepiye carane. Mulane aku ora puas karo playbook sing wis digawe saka GitHub, utawa artikel kaya: "Salin lan mbukak, bakal bisa."

Apa sing kita butuhake?

Kaya sing wis dakkandhakake, kanggo nulis playbook sampeyan kudu ngerti apa sing arep ditindakake lan kepiye carane. Ayo mutusake apa sing dibutuhake. Kanggo aplikasi Rails kita butuh sawetara paket sistem: nginx, postgresql (redis, etc). Kajaba iku, kita butuh versi ruby ​​​​khusus. Luwih becik nginstal liwat rbenv (rvm, asdf...). Mlaku kabeh iki minangka pangguna root mesthi dadi ide sing ala, dadi sampeyan kudu nggawe pangguna sing kapisah lan ngatur hak-hak kasebut. Sawise iki, sampeyan kudu ngunggah kode kita menyang server, nyalin konfigurasi kanggo nginx, postgres, etc lan miwiti kabeh layanan kasebut.

Akibaté, urutan tumindak kaya ing ngisor iki:

  1. Mlebet minangka root
  2. nginstal paket sistem
  3. nggawe pangguna anyar, ngatur hak, tombol ssh
  4. ngatur paket sistem (nginx etc) lan mbukak
  5. Kita nggawe pangguna ing database (sampeyan bisa langsung nggawe database)
  6. Mlebet minangka pangguna anyar
  7. Instal rbenv lan ruby ​​​​
  8. Nginstal bundler
  9. Ngunggah kode aplikasi
  10. Miwiti server Puma

Kajaba iku, tahap pungkasan bisa ditindakake kanthi nggunakake capistrano, paling ora saka kothak bisa nyalin kode menyang direktori rilis, ngalih rilis kanthi symlink nalika panyebaran sukses, nyalin konfigurasi saka direktori sing dienggo bareng, miwiti maneh puma, lsp. Kabeh iki bisa ditindakake nggunakake Ansible, nanging kenapa?

Struktur berkas

Ansible wis ketat struktur berkas kanggo kabeh file sampeyan, dadi paling apik kanggo nyimpen kabeh ing direktori kapisah. Menapa malih, iku ora dadi penting apa bakal ing aplikasi ril dhewe, utawa dhewe. Sampeyan bisa nyimpen file ing repositori git sing kapisah. Secara pribadi, aku nemokake paling trep kanggo nggawe direktori ansible ing direktori / config aplikasi ril lan nyimpen kabeh ing siji gudang.

Playbook prasaja

Playbook minangka file yml sing, nggunakake sintaks khusus, nggambarake apa sing kudu ditindakake Ansible lan kepiye carane. Ayo nggawe playbook pisanan sing ora nindakake apa-apa:

---
- name: Simple playbook
  hosts: all

Kene kita mung ngomong sing playbook kita disebut Simple Playbook lan sing isine kudu kaleksanan kanggo kabeh sarwa dumadi. Kita bisa nyimpen ing / ansible direktori karo jeneng playbook.yml lan nyoba kanggo mbukak:

ansible-playbook ./playbook.yml

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

Ansible ujar manawa ora ngerti host sing cocog karo kabeh dhaptar. Padha kudu kadhaptar ing khusus file inventaris.

Ayo nggawe ing direktori ansible sing padha:

123.123.123.123

Iki carane kita mung nemtokake host (saenipun host VPS kita kanggo testing, utawa sampeyan bisa ndhaftar localhost) lan nyimpen ing jeneng inventory.
Sampeyan bisa nyoba mbukak ansible karo file inventaris:

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

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

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

Yen sampeyan duwe akses ssh menyang host sing ditemtokake, banjur ansible bakal nyambung lan ngumpulake informasi babagan sistem remot. (TUGAS standar [Nglumpukake Fakta]) sawise iku bakal menehi laporan singkat babagan eksekusi (PLAY RECAP).

Kanthi gawan, sambungan nggunakake jeneng pangguna sing sampeyan mlebu ing sistem. Paling kamungkinan ora bakal ing inang. Ing file playbook, sampeyan bisa nemtokake pangguna sing digunakake kanggo nyambungake nggunakake arahan remote_user. Uga, informasi babagan sistem remot bisa uga asring ora perlu kanggo sampeyan lan sampeyan ora perlu mbuwang wektu kanggo ngumpulake. Tugas iki uga bisa dipateni:

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

Coba mbukak playbook maneh lan priksa manawa sambungan bisa digunakake. (Yen sampeyan nemtokake pangguna root, sampeyan uga kudu nemtokake arahan dadi: bener kanggo entuk hak sing luwih dhuwur. Kaya sing ditulis ing dokumentasi: become set to ‘true’/’yes’ to activate privilege escalation. sanajan ora sakabehe jelas sebabe).

Mungkin sampeyan bakal nampa kesalahan amarga kasunyatan sing ansible ora bisa nemtokake interpreter Python, banjur sampeyan bisa nemtokake kanthi manual:

ansible_python_interpreter: /usr/bin/python3 

Sampeyan bisa mangerteni ngendi sampeyan duwe python karo printah whereis python.

Nginstal paket sistem

Distribusi standar Ansible kalebu akeh modul kanggo nggarap macem-macem paket sistem, mula kita ora kudu nulis skrip bash kanthi alasan apa wae. Saiki kita butuh salah siji saka modul iki kanggo nganyari sistem lan nginstal paket sistem. Aku duwe Ubuntu Linux ing VPS, supaya nginstal paket sing digunakake apt-get и modul kanggo iku. Yen sampeyan nggunakake sistem operasi beda, sampeyan bisa uga kudu modul beda (eling, Aku ngandika ing awal sing kita kudu ngerti ing advance apa lan carane kita bakal nindakake). Nanging, sintaks kasebut bakal meh padha.

Ayo ditambahake playbook kita karo tugas pisanan:

---
- 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 persis tugas sing bakal ditindakake Ansible ing server remot. Kita menehi jeneng tugas supaya bisa nglacak eksekusi ing log. Lan kita njlèntrèhaké, nggunakake sintaks modul tartamtu, apa sing kudu dilakoni. Ing kasus iki apt: update_cache=yes - ngandika nganyari paket sistem nggunakake modul apt. Prentah kapindho rada rumit. We pass dhaftar paket kanggo modul apt lan ngandika sing lagi state kudu dadi present, yaiku, kita ngomong nginstal paket kasebut. Kanthi cara sing padha, kita bisa ngandhani supaya mbusak, utawa nganyari kanthi ngganti state. Wigati dimangerteni manawa rel bisa digunakake karo postgresql, kita butuh paket postgresql-contrib, sing saiki kita pasang. Maneh, sampeyan kudu ngerti lan nindakake iki; sing bisa ditindakake dhewe ora bakal nindakake iki.

Coba mbukak playbook maneh lan priksa manawa paket wis diinstal.

Nggawe pangguna anyar.

Kanggo nggarap pangguna, Ansible uga duwe modul - pangguna. Ayo nambah tugas liyane (Aku ndhelikake bagean playbook sing wis dingerteni ing mburi komentar supaya ora nyalin kabeh):

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

Kita nggawe pangguna anyar, nyetel schell lan sandhi. Banjur kita nemoni sawetara masalah. Apa yen jeneng panganggo kudu beda kanggo host sing beda? Lan nyimpen sandhi ing teks sing jelas ing playbook minangka ide sing ala banget. Kanggo miwiti, ayo sijine jeneng pangguna lan sandhi menyang variabel, lan ing pungkasan artikel aku bakal nuduhake carane ndhelik sandhi.

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

Variabel disetel ing playbooks nggunakake kurung kriting pindho.

Kita bakal nuduhake nilai variabel ing file inventaris:

123.123.123.123

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

Wigati direktif [all:vars] - ngandika sing pemblokiran sabanjuré teks punika variabel (var) lan padha ditrapake kanggo kabeh sarwa dumadi (kabeh).

Desaine uga menarik "{{ user_password | password_hash('sha512') }}". Bab iku ansible ora nginstal pangguna liwat user_add kaya sampeyan bakal nindakake kanthi manual. Lan nyimpen kabeh data langsung, mulane kita uga kudu ngonversi sandhi kasebut dadi hash sadurunge, yaiku prentah iki.

Ayo nambah pangguna menyang grup sudo. Nanging, sadurunge iki, kita kudu nggawe manawa klompok kasebut ana amarga ora ana sing bakal nindakake iki kanggo kita:

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

Kabeh iku cukup prasaja, kita uga duwe modul grup kanggo nggawe grup, karo sintaks banget padha apt. Banjur cukup kanggo ndhaptar grup iki menyang pangguna (groups: "sudo").
Sampeyan uga migunani kanggo nambah kunci ssh menyang pangguna iki supaya kita bisa mlebu nggunakake tanpa sandhi:

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

Ing kasus iki, desain menarik "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" - nyalin isi file id_rsa.pub (jeneng sampeyan bisa uga beda-beda), yaiku bagean umum saka tombol ssh lan diunggah menyang dhaptar tombol sing sah kanggo pangguna ing server.

Kalungguhan

Kabeh telung tugas kanggo nggawe nggunakake bisa gampang diklasifikasikaké dadi siji klompok tugas, lan iku bakal dadi apike kanggo nyimpen klompok iki kapisah saka playbook utama supaya ora tuwuh gedhe banget. Kanggo maksud iki, Ansible wis peran.
Miturut struktur file sing dituduhake ing wiwitan, peran kudu diselehake ing direktori peran sing kapisah, kanggo saben peran ana direktori kapisah kanthi jeneng sing padha, ing njero direktori tugas, file, template, dll.
Ayo nggawe struktur file: ./ansible/roles/user/tasks/main.yml (utama minangka file utama sing bakal dimuat lan dieksekusi nalika peran disambungake menyang playbook; file peran liyane bisa disambungake menyang). Saiki sampeyan bisa nransfer kabeh tugas sing ana gandhengane karo pangguna menyang file iki:

# 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

Ing playbook utama, sampeyan kudu nemtokake kanggo nggunakake peran pangguna:

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

Uga, bisa uga ana gunane nganyari sistem sadurunge kabeh tugas liyane; kanggo nindakake iki, sampeyan bisa ngganti jeneng blok kasebut tasks kang padha ditetepake ing pre_tasks.

Nyetel nginx

Kita kudu wis nginstal Nginx; kita kudu ngatur lan mbukak. Ayo dadi langsung ing peran. Ayo nggawe struktur file:

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

Saiki kita butuh file lan template. Bentenipun antarane wong-wong mau sing ansible nyalin file langsung, minangka. Lan cithakan kudu duwe ekstensi j2 lan bisa nggunakake nilai variabel nggunakake kurung kriting ganda sing padha.

Ayo ngaktifake nginx main.yml berkas. Kanggo iki, kita duwe modul systemd:

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

Ing kene kita ora mung ujar manawa nginx kudu diwiwiti (yaiku, diluncurake), nanging kita langsung ujar manawa kudu diaktifake.
Saiki ayo 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'

Kita nggawe file konfigurasi nginx utama (sampeyan bisa njupuk langsung saka server, utawa nulis dhewe). Lan uga file konfigurasi kanggo aplikasi kita ing direktori sites_available (iki ora perlu nanging migunani). Ing kasus sing sepisanan, kita nggunakake modul salinan kanggo nyalin file (file kasebut kudu ana ing /ansible/roles/nginx/files/nginx.conf). Ing kaloro, kita nyalin cithakan, ngganti nilai variabel. Cithakan kudu ing /ansible/roles/nginx/templates/my_app.j2). Lan bisa uga katon kaya iki:

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

Pay manungsa waé menyang sisipan {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} - iki kabeh variabel sing nilai Ansible bakal diganti menyang cithakan sadurunge nyalin. Iki migunani yen sampeyan nggunakake playbook kanggo macem-macem klompok host. Contone, kita bisa nambah file inventaris:

[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

Yen saiki kita mbukak playbook kita, bakal nindakake tugas sing ditemtokake kanggo loro host. Nanging ing wektu sing padha, kanggo host pementasan, variabel bakal beda karo produksi, lan ora mung ing peran lan playbook, nanging uga ing konfigurasi nginx. {{ inventory_hostname }} ora perlu kasebut ing file persediaan - iki variabel ansible khusus lan host sing playbook lagi mlaku disimpen ana.
Yen sampeyan pengin duwe file inventaris kanggo sawetara host, nanging mung mbukak kanggo siji klompok, iki bisa ditindakake kanthi printah ing ngisor iki:

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

Pilihan liyane yaiku nduwe file inventaris sing kapisah kanggo macem-macem klompok. Utawa sampeyan bisa gabungke loro pendekatan yen sampeyan duwe akeh host beda.

Ayo bali menyang nyetel nginx. Sawise nyalin file konfigurasi, kita kudu nggawe symlink ing sitest_enabled kanggo my_app.conf saka sites_available. Lan miwiti maneh 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

Kabeh iku prasaja kene - maneh modul ansible karo sintaks cukup standar. Nanging ana siji titik. Ora ana gunane miwiti maneh nginx saben wektu. Apa sampeyan ngelingi yen kita ora nulis printah kaya: "nindakake kaya iki", sintaks katon kaya "iki kudu duwe negara iki". Lan paling asring iki persis cara kerjane ansible. Yen grup wis ana, utawa paket sistem wis diinstal, banjur ansible bakal mriksa iki lan skip tugas. Uga, file ora bakal disalin yen padha rampung cocog karo sing wis ana ing server. Kita bisa njupuk kauntungan saka iki lan miwiti maneh nginx mung yen file konfigurasi wis diganti. Ana arahan registrasi kanggo iki:

# 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

Yen salah siji file konfigurasi diganti, salinan bakal digawe lan variabel bakal didaftar restart_nginx. Lan mung yen variabel iki wis didaftar, layanan bakal diwiwiti maneh.

Lan, mesthi, sampeyan kudu nambah peran nginx menyang playbook utama.

Nyetel postgresql

Kita kudu ngaktifake postgresql nggunakake systemd kanthi cara sing padha karo nginx, lan uga nggawe pangguna sing bakal digunakake kanggo ngakses database lan database kasebut dhewe.
Ayo nggawe 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 }}"

Aku ora bakal njlèntrèhaké carane nambah variabel kanggo inventaris, iki wis rampung kaping pirang-pirang, uga sintaks saka postgresql_db lan postgresql_user modul. Informasi liyane bisa ditemokake ing dokumentasi. Arahan sing paling menarik ing kene yaiku become_user: postgres. Kasunyatane yaiku kanthi standar, mung pangguna postgres sing duwe akses menyang database postgresql lan mung lokal. Arahan iki ngidini kita nglakokake perintah atas jenenge pangguna iki (yen kita duwe akses, mesthi).
Uga, sampeyan bisa uga kudu nambah baris kanggo pg_hba.conf kanggo ngidini akses pangguna anyar menyang database. Iki bisa ditindakake kanthi cara sing padha nalika ngganti konfigurasi nginx.

Lan mesthi, sampeyan kudu nambah peran postgresql menyang playbook utama.

Nginstal ruby ​​​​liwat rbenv

Ansible ora duwe modul kanggo nggarap rbenv, nanging diinstal kanthi kloning repositori git. Mulane, masalah iki dadi sing paling non-standar. Ayo nggawe peran kanggo dheweke /ansible/roles/ruby_rbenv/main.yml lan ayo miwiti ngisi:

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

Kita maneh nggunakake arahan become_user kanggo nggarap pangguna sing digawe kanggo tujuan kasebut. Wiwit rbenv diinstal ing direktori ngarep, lan ora global. Lan kita uga nggunakake modul git kanggo kloning repositori, nemtokake repo lan dest.

Sabanjure, kita kudu ndhaptar rbenv init ing bashrc lan nambah rbenv menyang PATH ana. Kanggo iki kita duwe 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 -)"'

Banjur sampeyan kudu nginstal ruby_build:

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

Lan pungkasane nginstal ruby. Iki ditindakake liwat rbenv, yaiku, mung nganggo perintah 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

Kita ngomong prentah sing kudu ditindakake lan apa. Nanging, ing kene kita nemokake kasunyatan manawa ansible ora mbukak kode sing ana ing bashrc sadurunge nindakake perintah kasebut. Iki tegese rbenv kudu ditetepake langsung ing script padha.

Masalah sabanjure amarga kasunyatan manawa perintah cangkang ora duwe negara saka sudut pandang. Tegese, ora bakal ana mriksa otomatis apa versi ruby ​​​​iki wis diinstal utawa ora. Kita bisa nindakake iki dhewe:

- 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

Kabeh sing isih ana yaiku nginstal bundler:

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

Lan maneh, nambah ruby_rbenv peran kita menyang playbook utama.

File sing dienggo bareng.

Umumé, persiyapan bisa rampung ing kene. Sabanjure, kabeh sing isih ana yaiku mbukak capistrano lan bakal nyalin kode kasebut dhewe, nggawe direktori sing dibutuhake lan miwiti aplikasi kasebut (yen kabeh wis dikonfigurasi kanthi bener). Nanging, capistrano asring mbutuhake file konfigurasi tambahan, kayata database.yml utawa .env Bisa disalin kaya file lan template kanggo nginx. Mung ana siji subtlety. Sadurunge nyalin file, sampeyan kudu nggawe struktur direktori, kaya iki:

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

kita nemtokake mung siji direktori lan ansible bakal kanthi otomatis nggawe wong tuwa yen perlu.

Ansible Vault

Kita wis nemokake kasunyatan manawa variabel bisa ngemot data rahasia kayata sandhi pangguna. Yen sampeyan wis nggawe .env file kanggo aplikasi, lan database.yml banjur kudu ana data kritis sing luwih akeh. Iku bakal apik kanggo ndhelikake saka prying mata. Kanggo maksud iki digunakake kubah sing bisa ditindakake.

Ayo nggawe file kanggo variabel /ansible/vars/all.yml (Ing kene sampeyan bisa nggawe file beda kanggo macem-macem klompok host, kaya ing file inventaris: production.yml, staging.yml, etc).
Kabeh variabel sing kudu dienkripsi kudu ditransfer menyang file iki nggunakake sintaks 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

Sawise file iki bisa dienkripsi nganggo printah:

ansible-vault encrypt ./vars/all.yml

Alami, nalika enkripsi, sampeyan kudu nyetel sandhi kanggo dekripsi. Sampeyan bisa ndeleng apa sing bakal ana ing file kasebut sawise nelpon printah iki.

Kanthi bantuan saka ansible-vault decrypt file bisa decrypted, dipunéwahi lan banjur ndhelik maneh.

Sampeyan ora perlu decrypt file kanggo bisa. Sampeyan nyimpen ndhelik lan mbukak playbook karo bantahan --ask-vault-pass. Ansible bakal njaluk sandhi, njupuk variabel, lan nglakokake tugas. Kabeh data bakal tetep ndhelik.

Printah lengkap kanggo sawetara klompok host lan vault sing bisa katon kaya iki:

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

Nanging aku ora bakal menehi teks lengkap playbooks lan peran, nulis dhewe. Amarga ansible kaya ngono - yen sampeyan ora ngerti apa sing kudu ditindakake, mula ora bakal ditindakake kanggo sampeyan.

Source: www.habr.com

Add a comment