Mametraka mpizara hametraka rindranasa Rails mampiasa Ansible

Tsy ela akory izay dia nila nanoratra boky Ansible maromaro aho hanomanana ny mpizara amin'ny fametrahana rindranasa Rails. Ary mahagaga fa tsy nahita boky torolalana tsotra aho. Tsy te handika ny bokin'olon-kafa aho nefa tsy nahatakatra ny zava-nitranga, ary tamin'ny farany dia tsy maintsy namaky ny antontan-taratasy aho, nanangona ny zavatra rehetra. Angamba afaka manampy olona hanafaingana ity dingana ity aho amin'ny fanampian'ity lahatsoratra ity.

Ny zavatra voalohany tokony ho takatra dia ny ansible dia manome anao interface tsara hanaovana lisitry ny hetsika efa voafaritra mialoha amin'ny mpizara lavitra amin'ny SSH. Tsy misy majika eto, tsy afaka mametraka plugin ianao ary mahazo fametrahana aotra amin'ny fampiharana anao miaraka amin'ny docker, fanaraha-maso ary zavatra hafa ivelan'ny boaty. Mba hanoratana boky filalaovana dia tsy maintsy fantatrao izay tena tianao hatao sy ny fomba hanaovana izany. Izany no mahatonga ahy tsy afa-po amin'ny boky kilalao efa vita avy amin'ny GitHub, na lahatsoratra toy ny hoe: "Mandika ary mandehana, dia hahomby izany."

Inona no ilaintsika?

Araka ny efa nolazaiko, mba hanoratra playbook dia mila mahafantatra izay tianao hatao sy ny fomba hanaovana izany. Andeha isika hanapa-kevitra izay ilaintsika. Ho an'ny fampiharana Rails dia mila fonosana rafitra maromaro isika: nginx, postgresql (redis, sns). Ankoatra izany, mila dikan-teny manokana amin'ny ruby ​​isika. Tsara ny mametraka azy amin'ny alalan'ny rbenv (rvm, asdf...). Ny fampandehanana izany rehetra izany amin'ny maha-mpampiasa faka dia hevitra ratsy foana, noho izany dia mila mamorona mpampiasa misaraka ianao ary manamboatra ny zony. Aorian'izany dia mila mampakatra ny code amin'ny mpizara ianao, mandika ny configs ho an'ny nginx, postgres, sns ary manomboka ireo serivisy rehetra ireo.

Vokatr'izany, ny filaharan'ny hetsika dia toy izao manaraka izao:

  1. Midira ho root
  2. mametraka fonosana rafitra
  3. mamorona mpampiasa vaovao, amboary ny zo, ssh key
  4. amboary ny fonosana rafitra (nginx sns) ary amboary izany
  5. Mamorona mpampiasa iray ao anaty angon-drakitra izahay (afaka mamorona tahiry avy hatrany ianao)
  6. Midira ho mpampiasa vaovao
  7. Mametraka rbenv sy ruby
  8. Fametrahana ny bundler
  9. Mampakatra ny kaody fampiharana
  10. Manokatra ny mpizara Puma

Ankoatr'izay, ny dingana farany dia azo atao amin'ny fampiasana capistrano, farafaharatsiny ivelan'ny boaty dia afaka mandika ny kaody ho any amin'ny lahatahiry famoahana, mamadika ny famoahana miaraka amin'ny symlink rehefa vita ny fametrahana, mandika configs avy amin'ny lahatahiry iombonana, mamerina ny puma, sns. Izany rehetra izany dia azo atao amin'ny fampiasana Ansible, fa nahoana?

Rafitra fichier

Ansible dia henjana firafitry ny rakitra ho an'ny rakitrao rehetra, noho izany dia tsara raha tehirizina ao anaty lahatahiry mitokana. Ankoatr'izay, tsy dia zava-dehibe loatra izany na ho ao amin'ny fampiharana rail mihitsy, na misaraka. Azonao atao ny mitahiry rakitra ao anaty tahiry git mitokana. Raha ny tena manokana, hitako fa mety indrindra ny mamorona lahatahiry azo antoka ao amin'ny lahatahiry / config an'ny rindranasa rail ary mitahiry ny zava-drehetra ao anaty tahiry iray.

Playbook tsotra

Playbook dia rakitra yml izay, mampiasa syntax manokana, mamaritra ny tokony hataon'ny Ansible sy ny fomba. Andao hamorona boky filalaovana voalohany tsy misy na inona na inona:

---
- name: Simple playbook
  hosts: all

Eto izahay dia milaza fotsiny fa ny bokintsika no antsoina Simple Playbook ary ny ao anatiny dia tokony hotanterahina ho an'ny mpampiantrano rehetra. Azontsika tehirizina ao amin'ny lahatahiry / ansible miaraka amin'ny anarana playbook.yml ary miezaka mihazakazaka:

ansible-playbook ./playbook.yml

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

Nilaza i Ansible fa tsy mahalala mpampiantrano mifanaraka amin'ny lisitra rehetra. Tsy maintsy voatanisa ao anaty lisitra manokana izy ireo rakitra firaketana.

Andao hamorona azy ao amin'ny lahatahiry ansible mitovy:

123.123.123.123

Izany no fomba amaritanay fotsiny ny mpampiantrano (tsara indrindra ny mpampiantrano ny VPS ho an'ny fitsapana, na azonao atao ny misoratra anarana localhost) ary tehirizo eo ambanin'ny anarana. inventory.
Azonao atao ny manandrana mihazakazaka ansible miaraka amin'ny fisie inventory:

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

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

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

Raha manana fidirana ssh amin'ny mpampiantrano voatondro ianao, dia hampifandray sy hanangona vaovao momba ny rafitra lavitra ny ansible. (TASK default [Manangona zava-misy]) aorian'izay dia hanome tatitra fohy momba ny famonoana (PLAY RECAP).

Amin'ny alàlan'ny default, ny fifandraisana dia mampiasa ny solonanarana izay idiranao ao amin'ny rafitra. Azo inoana fa tsy ho eo amin'ny mpampiantrano izany. Ao amin'ny rakitra playbook, azonao atao ny mamaritra hoe iza no mpampiasa hampiasaina hifandraisana amin'ny alàlan'ny torolàlana remote_user. Ary koa, mety tsy ilainao matetika ny fampahalalana momba ny rafitra lavitra ary tsy tokony handany fotoana hanangonana azy ianao. Ity asa ity ihany koa dia azo ajanona:

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

Andramo averina indray ny playbook ary ataovy azo antoka fa mandeha ny fifandraisana. (Raha nofaritanao ny mpampiasa root, dia mila mamaritra ny lasa: true directive ianao mba hahazoana zo ambony. Araka ny voasoratra ao amin'ny tahirin-kevitra: become set to ‘true’/’yes’ to activate privilege escalation. na dia tsy mazava tsara aza ny antony).

Angamba ianao hahazo hadisoana vokatry ny hoe tsy afaka mamaritra ny mpandika teny Python ny ansible, dia azonao atao ny mamaritra azy amin'ny tanana:

ansible_python_interpreter: /usr/bin/python3 

Azonao atao ny mahita ny toerana misy anao python miaraka amin'ny baiko whereis python.

Fametrahana fonosana rafitra

Ny fitsinjarana manara-penitra ansible dia ahitana mody maro miasa amin'ny fonosana rafitra isan-karazany, ka tsy mila manoratra sora-bash isika na inona na inona antony. Ankehitriny dia mila iray amin'ireo môdôly ireo izahay mba hanavao ny rafitra sy hametrahana fonosana rafitra. Manana Ubuntu Linux aho amin'ny VPS-ko, mba hametrahana fonosana ampiasaiko apt-get и module ho azy. Raha mampiasa rafitra fiasa hafa ianao dia mety mila module hafa ianao (tadidio, hoy aho tany am-piandohana fa mila mahafantatra mialoha izay hataontsika isika). Na izany aza, ny syntax dia azo inoana fa mitovy.

Andeha isika hanampy ny playbook amin'ny asa voalohany:

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

Ny asa dia ny asa izay hataon'ny Ansible amin'ny mpizara lavitra. Omentsika anarana ilay asa mba ahafahantsika manara-maso ny fanatanterahana azy ao anaty log. Ary famariparitanay, amin'ny fampiasana ny syntax amin'ny module manokana, ny tokony hataony. Raha izany dia apt: update_cache=yes - milaza ny fanavaozana ny fonosana rafitra amin'ny alàlan'ny apt module. Ny baiko faharoa dia somary sarotra kokoa. Mandefa lisitry ny fonosana amin'ny module apt izahay ary milaza fa izy ireo state tokony ho lasa present, izany hoe mametraka ireto fonosana ireto. Toy izany koa, azontsika atao ny milaza azy ireo hamafa azy ireo, na manavao azy ireo amin'ny fanovana tsotra izao state. Azafady, azafady fa ny rails mba hiasa amin'ny postgresql dia mila ny fonosana postgresql-contrib, izay apetrakay izao. Indray, mila mahafantatra sy manao an'izany ianao;

Andramo avereno averina ny playbook ary jereo fa napetraka ny fonosana.

Mamorona mpampiasa vaovao.

Mba hiara-hiasa amin'ny mpampiasa, Ansible koa dia manana module - mpampiasa. Andeha isika hanampy asa iray hafa (nafeniko tao ambadiky ny fanehoan-kevitra ireo ampahany efa fantatra amin'ny playbook mba tsy handika azy manontolo isaky ny mandeha):

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

Mamorona mpampiasa vaovao izahay, mametraka schell sy tenimiafina ho azy. Ary avy eo dia miatrika olana maro isika. Ahoana raha tokony ho hafa ny solon'anarana ho an'ny mpampiantrano samihafa? Ary ny fitehirizana ny tenimiafina amin'ny lahatsoratra mazava ao amin'ny playbook dia hevitra tena ratsy. Hanombohana, ndao apetraka ho variana ny solon'anarana sy ny tenimiafina, ary amin'ny faran'ny lahatsoratra dia hasehoko ny fomba hanafenana ny tenimiafina.

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

Apetraka ao amin'ny boky filalaovana ny fiovaovana amin'ny fampiasana braces olioly roa.

Hasehontsika ny sandan'ny variables ao amin'ny fichier inventory:

123.123.123.123

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

Mariho azafady ny torolàlana [all:vars] - milaza fa ny andian-dahatsoratra manaraka dia miovaova (vars) ary azo ampiharina amin'ny mpampiantrano rehetra (rehetra).

Mahaliana ihany koa ny famolavolana "{{ user_password | password_hash('sha512') }}". Ny zavatra dia ny ansible tsy mametraka ny mpampiasa amin'ny user_add toy ny ataonao tanana. Ary mitahiry mivantana ny angon-drakitra rehetra, izany no antony tsy maintsy mamadika ny tenimiafina ho lasa hash mialoha, izay no ataon'ity baiko ity.

Andao ampidirintsika amin'ny vondrona sudo ny mpampiasa antsika. Na izany aza, alohan'izany dia mila mahazo antoka isika fa misy vondrona toy izany satria tsy misy olona hanao izany ho antsika:

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

Tsotra ny zava-drehetra, manana module vondrona ihany koa izahay hamorona vondrona, miaraka amin'ny syntax mitovy amin'ny apt. Avy eo dia ampy ny manoratra ity vondrona ity amin'ny mpampiasa (groups: "sudo").
Tena ilaina koa ny manampy fanalahidin'ny ssh amin'ity mpampiasa ity mba ahafahantsika miditra amin'ny fampiasana azy tsy misy tenimiafina:

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

Amin'ity tranga ity, mahaliana ny famolavolana "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" — mandika ny votoatin'ny rakitra id_rsa.pub (mety ho hafa ny anaranao), izany hoe ny ampahany ampahibemaso amin'ny fanalahidin'ny ssh ary mampiakatra izany ao amin'ny lisitry ny lakile nahazo alalana ho an'ny mpampiasa ao amin'ny server.

anjara asa

Ireo asa telo amin'ny famoronana fampiasana dia azo sokajiana ho vondrona iray amin'ny asa, ary tsara ny mitahiry ity vondrona ity misaraka amin'ny playbook lehibe mba tsy hihalehibe loatra. Ho an'ity tanjona ity dia manana ny Ansible andraikitra.
Araka ny firafitry ny rakitra voalaza tany am-boalohany, ny anjara dia tsy maintsy apetraka ao amin'ny lahatahiry anjara manokana, ho an'ny anjara tsirairay dia misy lahatahiry misaraka mitovy anarana, ao anatin'ny lahatahiry, rakitra, templates, sns.
Andao hamorona firafitry ny rakitra: ./ansible/roles/user/tasks/main.yml (main no rakitra lehibe ho entina sy hotanterahina rehefa mifandray amin'ny playbook ny anjara asa iray; azo ampifandraisina amin'izany ny rakitra anjara hafa). Ankehitriny ianao dia afaka mamindra ny asa rehetra mifandraika amin'ny mpampiasa amin'ity rakitra ity:

# 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

Ao amin'ny playbook lehibe, tsy maintsy mamaritra ny fampiasana ny andraikitry ny mpampiasa ianao:

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

Ary koa, mety misy dikany ny fanavaozana ny rafitra alohan'ny asa hafa rehetra, azonao atao ny manova anarana ny sakana tasks ao anatin'izany no mamaritra azy ireo pre_tasks.

Fametrahana nginx

Tokony efa nametraka ny Nginx isika; Aleo atao avy hatrany eo amin'ny anjara. Andao hamorona firafitry ny rakitra:

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

Mila rakitra sy môdely isika izao. Ny maha samy hafa azy ireo dia ny ansible mandika mivantana ny rakitra, toy ny. Ary ny môdely dia tsy maintsy manana ny fanitarana j2 ary afaka mampiasa sanda miovaova izy ireo amin'ny fampiasana braces curly roa mitovy.

Alefaso ny nginx main.yml rakitra. Noho izany dia manana module systemd izahay:

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

Eto isika dia tsy milaza fotsiny fa tsy maintsy atomboka ny nginx (izany hoe, manomboka izany), fa avy hatrany dia milaza isika fa tsy maintsy alefa.
Andeha isika handika ny rakitra configuration:

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

Mamorona ny fichier configuration nginx lehibe izahay (azonao alaina mivantana avy amin'ny mpizara izany, na soraty ny tenanao). Ary koa ny fichier configuration ho an'ny fampiharana ataontsika ao amin'ny lahatahiry sites_available (tsy ilaina izany fa mahasoa). Amin'ny tranga voalohany, mampiasa ny maodely dika mitovy handikana rakitra (tsy maintsy ao anaty /ansible/roles/nginx/files/nginx.conf). Amin'ny faharoa, mandika ny môdely isika, manolo ny sandan'ny variables. Ny môdely dia tokony ho ao anatiny /ansible/roles/nginx/templates/my_app.j2). Ary mety ho toy izao izany:

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

Tandremo ny fampidirana {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} - ireo no variables rehetra izay hasoloin'ny Ansible ny sandany amin'ny maodely alohan'ny hanaovana kopia. Tena ilaina izany raha mampiasa playbook ho an'ny vondrona mpampiantrano samihafa ianao. Ohatra, afaka manampy ny fichier inventory izahay:

[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

Raha manomboka ny playbook isika izao dia hanatanteraka ny asa voafaritra ho an'ny mpampiantrano roa. Saingy amin'ny fotoana iray ihany, ho an'ny mpampiantrano fampisehoana, ny variables dia tsy mitovy amin'ny famokarana, ary tsy amin'ny anjara asa sy ny playbooks, fa amin'ny configs nginx ihany koa. {{ inventory_hostname }} tsy mila voalaza ao amin'ny fichier inventory - ity variable ansible manokana ary voatahiry ao ny mpampiantrano izay misy ny playbook amin'izao fotoana izao.
Raha te hanana fichier inventory ho an'ny mpampiantrano maromaro ianao, saingy mihazakazaka ho an'ny vondrona iray ihany, dia azo atao amin'ity baiko manaraka ity:

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

Safidy iray hafa dia ny fananana rakitra firaketana misaraka ho an'ny vondrona samihafa. Na azonao atao ny manambatra ireo fomba roa ireo raha manana mpampiantrano maro samihafa ianao.

Andao hiverina amin'ny fametrahana nginx. Rehefa avy mandika ny fisie fanefena dia mila mamorona symlink amin'ny sitest_enabled amin'ny my_app.conf avy amin'ny sites_available. Ary avereno indray ny 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

Tsotra ny zava-drehetra eto - ireo modules azo ampiasaina miaraka amin'ny syntax mahazatra. Saingy misy teboka iray. Tsy misy dikany ny mamerina ny nginx isaky ny mandeha. Voamarikao ve fa tsy manoratra baiko toy ny hoe: "ataovy toy izao", ny syntax dia toa "tokony hanana an'ity fanjakana ity". Ary matetika dia toy izany indrindra no fiasan'ny ansible. Raha efa misy ny vondrona, na efa napetraka ny fonosana rafitra, dia hanamarina izany ny ansible ary hitsipaka ilay asa. Tsy azo adika koa ny rakitra raha mifanaraka tanteraka amin'izay efa ao amin'ny server. Azontsika atao ny manararaotra izany ary manomboka ny nginx raha toa ka niova ny rakitra fikirakirana. Misy torolàlana momba ny fisoratana anarana momba izany:

# 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

Raha miova ny iray amin'ireo fisie fichier dia hisy kopia hatao ary hosoratana ny fari-piadidiana restart_nginx. Ary raha toa ka efa voasoratra io faribolana io ihany no hamerenana ny serivisy.

Ary, mazava ho azy, mila ampidirinao ny anjara asan'ny nginx amin'ny playbook lehibe.

Fametrahana postgresql

Mila mamela ny postgresql mampiasa systemd amin'ny fomba mitovy amin'ny nataonay tamin'ny nginx izahay, ary koa mamorona mpampiasa iray izay hampiasainay hidirana amin'ny database sy ny database.
Andao hamorona anjara /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 }}"

Tsy hamariparitra ny fomba hanampiana variables amin'ny inventory aho, efa natao imbetsaka izany, ary koa ny syntax ny postgresql_db sy postgresql_user modules. Misy fampahalalana bebe kokoa hita ao amin'ny antontan-taratasy. Ny torolalana mahaliana indrindra eto dia become_user: postgres. Ny zava-misy dia amin'ny alàlan'ny default, ny mpampiasa postgres ihany no afaka miditra amin'ny database postgresql ary eo an-toerana ihany. Ity torolàlana ity dia ahafahantsika manatanteraka baiko amin'ny anaran'ity mpampiasa ity (raha manana fidirana izahay, mazava ho azy).
Ary koa, mety tsy maintsy manampy tsipika ianao amin'ny pg_hba.conf mba ahafahan'ny mpampiasa vaovao miditra amin'ny angon-drakitra. Izany dia azo atao amin'ny fomba mitovy amin'ny nanovantsika ny config nginx.

Ary mazava ho azy, mila manampy ny anjara postgresql amin'ny playbook lehibe ianao.

Fametrahana ruby ​​amin'ny alàlan'ny rbenv

Ansible dia tsy manana mody miasa amin'ny rbenv, fa apetraka amin'ny alàlan'ny fametahana git repository. Noho izany, ity olana ity dia lasa tsy manara-penitra indrindra. Andao hamorona andraikitra ho azy /ansible/roles/ruby_rbenv/main.yml ary andeha hameno azy:

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

Ampiasainay indray ny toromarika lasa_user mba hiasa eo ambanin'ny mpampiasa noforoninay ho an'ireo tanjona ireo. Satria rbenv dia napetraka ao amin'ny lahatahiry an-tranony, fa tsy maneran-tany. Ary mampiasa ny module git ihany koa izahay mba hametahana ny tahiry, manondro repo sy dest.

Manaraka, mila misoratra anarana rbenv init amin'ny bashrc isika ary ampio rbenv amin'ny PATH any. Mba hanaovana izany dia manana ny module lineinfile izahay:

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

Avy eo dia mila mametraka ruby_build ianao:

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

Ary farany mametraka ruby. Izany dia atao amin'ny alàlan'ny rbenv, izany hoe amin'ny baiko bash fotsiny:

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    rbenv install {{ ruby_version }}
  args:
    executable: /bin/bash

Lazainay hoe didy inona no hotanterahina ary inona. Na izany aza, eto isika dia mahita ny zava-misy fa ny ansible dia tsy mandeha ny code voarakitra ao amin'ny bashrc alohan'ny handefasana ny baiko. Midika izany fa ny rbenv dia tsy maintsy voafaritra mivantana amin'ny script mitovy.

Ny olana manaraka dia noho ny tsy fisian'ny baiko shell amin'ny fomba fijery azo antoka. Izany hoe, tsy hisy fisavana mandeha ho azy raha apetraka io version ruby ​​io na tsia. Afaka manao izany isika:

- 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

Ny hany sisa tavela dia ny fametrahana bundler:

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

Ary indray, ampio ny anjarantsika ruby_rbenv amin'ny playbook lehibe.

rakitra zaraina.

Amin'ny ankapobeny dia mety ho vita eto ny fanamboarana. Manaraka, ny hany sisa tavela dia ny mihazakazaka capistrano ary handika ny kaody mihitsy izy, mamorona ny lahatahiry ilaina ary manomboka ny fampiharana (raha voalamina tsara ny zava-drehetra). Na izany aza, matetika ny capistrano dia mitaky rakitra fanamafisana fanampiny, toy ny database.yml na .env Azo adika toy ny rakitra sy templates ho an'ny nginx izy ireo. Iray ihany ny hafetsena. Alohan'ny handikana rakitra dia mila mamorona rafitra lahatahiry ho azy ireo ianao, toy izao:

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

Tsy misy afa-tsy lahatahiry iray ihany no resahinay ary ny ansible dia hamorona ho azy ny ray aman-dreny raha ilaina.

Ansible Vault

Efa nahita ny zava-misy izahay fa mety misy angon-drakitra miafina toy ny tenimiafin'ny mpampiasa ny variables. Raha namorona ianao .env rakitra ho an'ny fangatahana, ary database.yml dia tsy maintsy misy angon-drakitra mitsikera bebe kokoa toy izany. Tsara ny manafina azy ireo amin'ny mason-tsivana. Ho an'ity tanjona ity dia ampiasaina vault azo antoka.

Andao hamorona rakitra ho an'ny variables /ansible/vars/all.yml (eto ianao dia afaka mamorona rakitra samihafa ho an'ny vondrona mpampiantrano isan-karazany, toy ny ao amin'ny fichier inventory: production.yml, staging.yml, sns).
Tsy maintsy afindra amin'ity rakitra ity amin'ny alàlan'ny syntax yml mahazatra ny fari-pahalalana rehetra tsy maintsy apetraka:

# 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

Aorian'izay dia azo fehezina amin'ny baiko ity rakitra ity:

ansible-vault encrypt ./vars/all.yml

Mazava ho azy, rehefa manao encryption dia mila mametraka tenimiafina ho an'ny decryption ianao. Azonao jerena izay ho ao anatin'ilay rakitra rehefa avy niantso an'io baiko io ianao.

Amin'ny fanampiana ansible-vault decrypt ny rakitra dia azo decryption, ovaina ary avy eo miafina indray.

Tsy mila mamadika ny rakitra ianao raha te hiasa. Tehirizinao amin'ny alàlan'ny encryption izany ary mihazakazaka ny playbook miaraka amin'ny tohan-kevitra --ask-vault-pass. Hangataka ny tenimiafina i Ansible, haka ireo fari-pitsipika ary hanatanteraka ny asa. Ny angon-drakitra rehetra dia hijanona ho voarakotra.

Ny baiko feno ho an'ny vondrona mpampiantrano maromaro sy vault azo atao dia ho toy izao:

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

Saingy tsy homeko anao ny lahatsoratra feno momba ny playbook sy ny anjara asa, soraty ny tenanao. Satria ny ansible dia toy izany - raha tsy azonao izay tokony hatao dia tsy hanao izany ho anao izany.

Source: www.habr.com

Add a comment