د ځواب وړ په کارولو سره د ریل غوښتنلیک ځای په ځای کولو لپاره د سرور تنظیم کول

ډیر وخت دمخه ما اړتیا درلوده چې د ریل غوښتنلیک پلي کولو لپاره سرور چمتو کولو لپاره څو ځواب ورکوونکي لوبې کتابونه ولیکم. او، په حیرانتیا سره، ما یو ساده ګام په ګام لارښود ونه موندل. زه نه غواړم د بل چا د لوبو کتاب کاپي کړم پرته لدې چې پوه شم چې څه پیښیږي ، او په پای کې ما باید اسناد ولولي ، هرڅه پخپله راټول کړي. شاید زه د دې مقالې په مرسته د یو چا سره د دې پروسې ګړندۍ کولو کې مرسته کولی شم.

د پوهیدو لپاره لومړی شی دا دی چې ځواب ورکوونکي تاسو ته د SSH له لارې په ریموټ سرور (ونو) کې د کړنو دمخه ټاکل شوي لیست ترسره کولو لپاره مناسب انٹرفیس چمتو کوي. دلته هیڅ جادو شتون نلري ، تاسو نشئ کولی پلگ ان نصب کړئ او د بکس څخه بهر د ډاکر ، نظارت او نورو سامانونو سره د خپل غوښتنلیک صفر ډاؤنټایم ګمارنه ترلاسه کړئ. د لوبو کتاب لیکلو لپاره ، تاسو باید پوه شئ چې واقعیا تاسو څه کول غواړئ او څنګه یې وکړئ. له همدې امله زه د GitHub څخه د چمتو شوي لوبو کتابونو څخه راضي نه یم، یا د مقالو لکه: "کاپي او چلول، دا به کار وکړي."

موږ څه ته اړتیا لرو؟

لکه څنګه چې ما مخکې وویل، د لوبې کتاب لیکلو لپاره تاسو اړتیا لرئ پوه شئ چې تاسو څه کول غواړئ او څنګه یې وکړئ. راځئ پریکړه وکړو چې موږ څه ته اړتیا لرو. د ریل غوښتنلیک لپاره موږ به ډیری سیسټم کڅوړو ته اړتیا ولرو: nginx، postgresql (redis، etc). برسېره پردې، موږ د روبي ځانګړي نسخه ته اړتیا لرو. دا غوره ده چې دا د rbenv (rvm، asdf...) له لارې نصب کړئ. د روټ کارونکي په توګه دا ټول چلول تل یو بد نظر دی ، نو تاسو اړتیا لرئ یو جلا کارونکی رامینځته کړئ او د هغه حقونه تنظیم کړئ. له دې وروسته، تاسو اړتیا لرئ چې زموږ کوډ سرور ته اپلوډ کړئ، د nginx، postgres، او نورو لپاره تشکیلات کاپي کړئ او دا ټول خدمتونه پیل کړئ.

د پایلې په توګه، د کړنو ترتیب په لاندې ډول دی:

  1. د روټ په توګه ننوتل
  2. د سیسټم کڅوړې نصب کړئ
  3. یو نوی کارن جوړ کړئ، حقوق تنظیم کړئ، ssh کیلي
  4. د سیسټم کڅوړې تنظیم کړئ (nginx etc) او دوی یې پرمخ وړئ
  5. موږ په ډیټابیس کې یو کارن جوړوو (تاسو کولی شئ سمدلاسه ډیټابیس جوړ کړئ)
  6. د نوي کارونکي په توګه ننوتل
  7. rbenv او روبي نصب کړئ
  8. د بنډل نصب کول
  9. د غوښتنلیک کوډ پورته کول
  10. د پوما سرور په لاره اچول

سربیره پردې ، وروستي مرحلې د کیپسټرانو په کارولو سره ترسره کیدی شي ، لږترلږه د بکس څخه بهر دا کولی شي کوډ د خوشې کولو لارښودونو کې کاپي کړي ، خوشې کول د بریالي پلي کولو وروسته د سم لینک سره بدل کړي ، د ګډ لارښود څخه کاپي تشکیلات ، پوما بیا پیل کړئ ، او داسې نور. دا ټول د ځواب په کارولو سره ترسره کیدی شي، مګر ولې؟

د فایل جوړښت

ځواب سخت دی د فایل جوړښت ستاسو د ټولو فایلونو لپاره، نو دا غوره ده چې دا ټول په جلا لارښود کې وساتئ. سربیره پردې ، دا دومره مهمه نده چې ایا دا به پخپله د ریل غوښتنلیک کې وي ، یا په جلا توګه. تاسو کولی شئ فایلونه په جلا git ذخیره کې ذخیره کړئ. په شخصي توګه ، ما دا خورا اسانه وموندله چې د ریل غوښتنلیک /config لارښود کې د ځواب وړ لارښود رامینځته کړئ او هرڅه په یوه ذخیره کې ذخیره کړئ.

ساده Playbook

Playbook یو yml فایل دی چې د ځانګړي ترکیب په کارولو سره تشریح کوي چې ځواب باید څه وکړي او څنګه. راځئ چې لومړی د لوبو کتاب جوړ کړو چې هیڅ نه کوي:

---
- name: Simple playbook
  hosts: all

دلته موږ په ساده ډول ووایو چې زموږ د لوبې کتاب ویل کیږي Simple Playbook او دا چې د هغې مینځپانګې باید د ټولو کوربه توب لپاره اجرا شي. موږ کولی شو دا د نوم سره په /ansible لارښود کې خوندي کړو playbook.yml او د چلولو هڅه وکړئ:

ansible-playbook ./playbook.yml

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

ځواب ورکوونکي وايي چې دا هیڅ کوربه نه پوهیږي چې د ټول لیست سره سمون لري. دوی باید په ځانګړي ډول لیست شي د لیست فایل.

راځئ چې دا په ورته ځواب ورکوونکي لارښود کې جوړ کړو:

123.123.123.123

دا څنګه موږ په ساده ډول کوربه مشخص کوو (په مثالي ډول زموږ د VPS کوربه د ازموینې لپاره ، یا تاسو کولی شئ لوکل هوسټ راجستر کړئ) او د نوم لاندې یې خوندي کړئ inventory.
تاسو کولی شئ د انویټري فایل سره د ځواب وړ چلولو هڅه وکړئ:

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

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

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

که تاسو ټاکل شوي کوربه ته ssh لاسرسی لرئ ، نو ځواب به د ریموټ سیسټم په اړه معلومات وصل او راټول کړي. (ډیفالټ TASK [د حقایقو راټولول]) چې وروسته به دا د اجرا کولو په اړه یو لنډ راپور وړاندې کړي (PLAY RECAP).

د ډیفالټ په واسطه، پیوستون د هغه کارن نوم کاروي چې تاسو یې سیسټم ته ننوتلی یاست. دا به ډیری احتمال په کوربه کې نه وي. د پلی بوک فایل کې ، تاسو کولی شئ مشخص کړئ چې کوم کارونکي د ریموټ_یوزر لارښود په کارولو سره وصل کولو لپاره وکاروئ. همچنان ، د ریموټ سیسټم په اړه معلومات ممکن اکثرا تاسو ته غیر ضروري وي او تاسو باید د هغې په راټولولو کې وخت ضایع نکړئ. دا دنده هم غیر فعال کیدی شي:

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

بیا د پلی بوک چلولو هڅه وکړئ او ډاډ ترلاسه کړئ چې پیوستون کار کوي. (که تاسو د روټ کارونکي مشخص کړئ، نو تاسو اړتیا لرئ د لوړ حق ترلاسه کولو لپاره د بن: ریښتین لارښود مشخص کړئ. لکه څنګه چې په اسنادو کې لیکل شوي: become set to ‘true’/’yes’ to activate privilege escalation. که څه هم دا په بشپړه توګه روښانه نه ده چې ولې).

شاید تاسو به د دې حقیقت له امله یوه تېروتنه ترلاسه کړئ چې ځواب ورکونکی نشي کولی د Python ژباړونکی وټاکي ، نو تاسو کولی شئ دا په لاسي ډول مشخص کړئ:

ansible_python_interpreter: /usr/bin/python3 

تاسو کولی شئ ومومئ چیرې چې تاسو د کمانډ سره python لرئ whereis python.

د سیسټم کڅوړې نصب کول

د ځواب وړ معیاري توزیع کې د مختلف سیسټم کڅوړو سره کار کولو لپاره ډیری ماډلونه شامل دي ، نو موږ د هیڅ دلیل لپاره د بش سکریپټونو لیکلو ته اړتیا نلرو. اوس موږ د دې ماډلونو څخه یو ته اړتیا لرو ترڅو سیسټم تازه کړو او د سیسټم کڅوړې نصب کړو. زه په خپل VPS کې اوبنټو لینکس لرم ، نو د کڅوړو نصبولو لپاره چې زه یې کاروم apt-get и د دې لپاره ماډل. که تاسو مختلف عملیاتي سیسټم کاروئ، نو تاسو ممکن یو مختلف ماډل ته اړتیا ولرئ (په یاد ولرئ، ما په پیل کې وویل چې موږ باید مخکې له مخکې پوه شو چې څه او څنګه به یې وکړو). په هرصورت، نحو به ډیری احتمال ورته وي.

راځئ چې زموږ د لوبو کتاب د لومړي دندو سره ضمیمه کړو:

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

دنده په سمه توګه هغه دنده ده چې ځواب ورکوونکي به په ریموټ سرورونو کې ترسره کړي. موږ دندې ته یو نوم ورکوو ترڅو موږ وکولی شو په لاګ کې د هغې اجرا تعقیب کړو. او موږ د یو ځانګړي ماډل ترکیب په کارولو سره تشریح کوو چې دا څه کولو ته اړتیا لري. په دې صورت کې apt: update_cache=yes - د اپټ ماډل په کارولو سره د سیسټم کڅوړو تازه کولو ته وايي. دوهم کمانډ یو څه ډیر پیچلی دی. موږ اپټ ماډل ته د کڅوړو لیست لیږدوو او وایو چې دا دي state باید شي present، دا دی، موږ وایو چې دا کڅوړې نصب کړئ. په ورته ډول، موږ کولی شو دوی ته ووایو چې دوی حذف کړئ، یا په ساده ډول د بدلون له لارې یې تازه کړئ state. مهرباني وکړئ په یاد ولرئ چې د ریلونو لپاره چې د postgresql سره کار وکړي موږ د postgresql-contrib کڅوړې ته اړتیا لرو، کوم چې موږ اوس نصب کوو. یوځل بیا ، تاسو اړتیا لرئ پوه شئ او دا کار وکړئ؛ په خپله ځواب ویونکی به دا ونه کړي.

بیا د پلی بوک چلولو هڅه وکړئ او وګورئ چې کڅوړې نصب شوي.

د نوي کاروونکو رامینځته کول.

د کاروونکو سره کار کولو لپاره، ځواب ورکوونکي ماډل هم لري - کارن. راځئ چې یو بل کار اضافه کړو (ما د لوبو کتاب دمخه پیژندل شوې برخې د نظرونو شاته پټې کړې ترڅو هر ځل یې په بشپړ ډول کاپي نکړو):

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

موږ یو نوی کارن جوړوو، د هغې لپاره سکیل او پټنوم ترتیب کوو. او بیا موږ د ډیری ستونزو سره مخ یو. څه که چیرې کارن نومونه د مختلف کوربه توب لپاره مختلف وي؟ او په پلی بوک کې په روښانه متن کې د پټنوم ذخیره کول خورا بد نظر دی. د پیل کولو لپاره ، راځئ چې د کارونکي نوم او پټنوم په متغیرونو کې واچوو ، او د مقالې په پای کې به زه وښیم چې څنګه پاسورډ کوډ کړئ.

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

متغیرات د دوه ګونی منحلاتو په کارولو سره د لوبو کتابونو کې تنظیم شوي.

موږ به د انوینټری فایل کې د متغیرونو ارزښتونه په ګوته کړو:

123.123.123.123

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

لارښوونې ته پام وکړئ [all:vars] - دا وايي چې د متن راتلونکی بلاک متغیرات (vars) دي او دا په ټولو کوربه (ټولو) باندې د تطبیق وړ دي.

ډیزاین هم په زړه پوری دی "{{ user_password | password_hash('sha512') }}". خبره دا ده چې ځواب ورکوونکي له لارې کاروونکي نه نصبوي user_add لکه څنګه چې تاسو دا په لاسي ډول کوئ. او دا ټول معلومات مستقیم خوندي کوي ، له همدې امله موږ باید پاسورډ هم دمخه په هش کې بدل کړو ، کوم چې دا کمانډ کوي.

راځئ چې خپل کارن سوډو ګروپ ته اضافه کړو. په هرصورت، مخکې له دې موږ باید ډاډ ترلاسه کړو چې دا ډول ډله شتون لري ځکه چې هیڅوک به زموږ لپاره دا کار ونه کړي:

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

هرڅه خورا ساده دي ، موږ د ګروپونو رامینځته کولو لپاره د ګروپ ماډل هم لرو ، د ترکیب سره ډیر ورته apt سره. بیا دا کافی دی چې دا ګروپ کارونکي ته راجستر کړئ (groups: "sudo").
دا کارونکي ته د ssh کیلي اضافه کول هم ګټور دي ترڅو موږ وکولی شو پرته له پاسورډ څخه په کارولو سره لاګ ان شو:

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

په دې حالت کې، ډیزاین په زړه پورې دی "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" - دا د id_rsa.pub فایل مینځپانګې کاپي کوي (ستاسو نوم ممکن توپیر ولري) ، دا د ssh کیلي عامه برخه ده او په سرور کې د کارونکي لپاره د مجاز کیلي لیست ته اپلوډ کوي.

رولونه

د کارونې رامینځته کولو لپاره ټولې درې دندې په اسانۍ سره د دندو په یوه ګروپ کې طبقه بندي کیدی شي ، او دا به ښه نظر وي چې دا ګروپ د اصلي لوبو کتاب څخه جلا ذخیره کړئ ترڅو دا خورا لوی نشي. د دې هدف لپاره، ځواب ورکوونکي لري رولونه.
د فایل جوړښت له مخې چې په پیل کې ښودل شوي، رولونه باید په جلا رول ډایرکټر کې ځای په ځای شي، د هر رول لپاره د ورته نوم سره جلا ډایرکټر شتون لري، د دندو، فایلونو، ټیمپلیټونو، او داسې نورو ډایرکټرۍ دننه.
راځئ چې د فایل جوړښت جوړ کړو: ./ansible/roles/user/tasks/main.yml (اصلي اصلي فایل دی چې پورته کیږي او اجرا کیږي کله چې رول د لوبې کتاب سره وصل وي؛ نور رول فایلونه ورسره وصل کیدی شي). اوس تاسو کولی شئ د کارونکي پورې اړوند ټولې دندې دې فایل ته انتقال کړئ:

# 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

په اصلي لوبو کتاب کې، تاسو باید د کارونکي رول کارولو لپاره مشخص کړئ:

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

همچنان ، دا ممکن د نورو ټولو دندو دمخه سیسټم تازه کولو معنی ولري؛ د دې کولو لپاره ، تاسو کولی شئ د بلاک نوم بدل کړئ tasks په کوم کې چې دوی تعریف شوي دي pre_tasks.

د nginx تنظیم کول

موږ باید دمخه نګینکس نصب کړو؛ موږ اړتیا لرو چې دا تنظیم کړو او چل یې کړو. راځئ چې سمدلاسه په رول کې ترسره کړو. راځئ چې د فایل جوړښت جوړ کړو:

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

اوس موږ فایلونو او ټیمپلیټونو ته اړتیا لرو. د دوی ترمنځ توپیر دا دی چې ځواب ورکوونکي فایلونه مستقیم کاپي کوي، لکه څنګه چې وي. او ټیمپلیټونه باید د j2 توسیع ولري او دوی کولی شي د ورته ډبل کرلي کنډکونو په کارولو سره متغیر ارزښتونه وکاروي.

راځئ چې nginx فعال کړو main.yml دوتنه. د دې لپاره موږ یو سیسټم ماډل لرو:

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

دلته موږ نه یوازې دا وایو چې نګینکس باید پیل شي (دا دی، موږ یې پیل کوو)، مګر موږ سمدلاسه وایو چې دا باید فعال شي.
اوس راځئ چې د تشکیلاتو فایلونه کاپي کړو:

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

موږ د اصلي نګینکس ترتیب کولو فایل رامینځته کوو (تاسو کولی شئ دا مستقیم له سرور څخه واخلئ ، یا یې پخپله ولیکئ). او همدارنګه زموږ د غوښتنلیک لپاره د ترتیب کولو فایل په سایټونو_available لارښود کې (دا اړین ندی مګر ګټور دی). په لومړي حالت کې، موږ د فایلونو کاپي کولو لپاره د کاپي ماډل کاروو (دوتنه باید دننه وي /ansible/roles/nginx/files/nginx.conf). په دویمه کې، موږ ټیمپلیټ کاپي کوو، د متغیر ارزښتونو ځای په ځای کولو سره. ټیمپلیټ باید دننه وي /ansible/roles/nginx/templates/my_app.j2). او دا ممکن د دې په څیر یو څه ښکاري:

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

داخلونو ته پاملرنه وکړئ {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} - دا ټول متغیرونه دي چې ارزښتونه یې Ansible به د کاپي کولو دمخه په ټیمپلیټ کې ځای په ځای کړي. دا ګټور دی که تاسو د کوربه مختلف ګروپونو لپاره د لوبو کتاب وکاروئ. د مثال په توګه، موږ کولی شو زموږ د لیست فایل اضافه کړو:

[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

که موږ اوس زموږ د لوبو کتاب پیل کړو، دا به د دواړو کوربه توب لپاره ټاکل شوي دندې ترسره کړي. مګر په ورته وخت کې، د سټینګ کوربه لپاره، متغیرات به د تولید څخه توپیر ولري، او نه یوازې په رولونو او لوبو کتابونو کې، بلکې د نګینکس ترتیبونو کې هم. {{ inventory_hostname }} اړتیا نشته چې د لیست فایل کې مشخص شي - دا ځانګړی ځواب وړ متغیر او کوربه چې د لوبې کتاب اوس مهال روان دی هلته زیرمه شوی.
که تاسو غواړئ د څو کوربه توب لپاره د لیست فایل ولرئ، مګر یوازې د یوې ډلې لپاره پرمخ وړئ، دا د لاندې کمانډ سره ترسره کیدی شي:

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

بل اختیار دا دی چې د مختلف ګروپونو لپاره جلا انفرادي فایلونه ولري. یا تاسو کولی شئ دوه طریقې سره یوځای کړئ که تاسو ډیری مختلف کوربه لرئ.

راځئ چې بیرته د nginx تنظیم کولو ته لاړ شو. د تشکیلاتو فایلونو کاپي کولو وروسته ، موږ اړتیا لرو په sitest_enabled کې د sites_available څخه my_app.conf ته یو سم لینک جوړ کړو. او 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

دلته هرڅه ساده دي - بیا د کافي معیاري ترکیب سره د ځواب وړ ماډلونه. مګر یو ټکی شتون لري. هر ځل د نګینکس بیا پیل کولو کې هیڅ معنی نشته. ایا تاسو لیدلي چې موږ کمانډونه نه لیکو لکه: "دا داسې وکړئ"، ترکیب داسې ښکاري چې "دا باید دا حالت ولري". او ډیری وختونه دا دقیقا څنګه ځواب ورکوونکي کار کوي. که چیرې ډله دمخه شتون ولري ، یا د سیسټم کڅوړه دمخه نصب شوې وي ، نو ځواب ورکونکی به د دې لپاره وګوري او دنده پریږدي. همچنان ، فایلونه به کاپي نشي که چیرې دوی په بشپړ ډول هغه څه سره سمون ولري چې دمخه په سرور کې شتون لري. موږ کولی شو له دې څخه ګټه واخلو او یوازې نګینکس بیا پیل کړو که چیرې د تشکیلاتو فایلونه بدل شوي وي. د دې لپاره د راجستر لارښود شتون لري:

# 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

که چیرې د تشکیلاتو فایلونو څخه یو بدل شي ، نو کاپي به رامینځته شي او متغیر به ثبت شي restart_nginx. او یوازې که دا متغیر ثبت شوی وي نو خدمت به بیا پیل شي.

او، البته، تاسو اړتیا لرئ چې د نګینکس رول په اصلي لوبې کتاب کې اضافه کړئ.

د postgresql تنظیم کول

موږ اړتیا لرو چې postgresql د سیسټم په کارولو سره په ورته ډول فعال کړو لکه څنګه چې موږ د نګینکس سره کړی و، او یو کارن هم جوړ کړو چې موږ به یې ډیټابیس او ډیټابیس ته د لاسرسي لپاره وکاروو.
راځئ چې یو رول جوړ کړو /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 }}"

زه به تشریح نه کړم چې څنګه په موجوداتو کې متغیرونه اضافه کړم ، دا دمخه څو ځله ترسره شوی ، په بیله بیا د postgresql_db او postgresql_user ماډلونو ترکیب. نور معلومات په اسنادو کې موندل کیدی شي. دلته ترټولو په زړه پوری لارښود دی become_user: postgres. حقیقت دا دی چې د ډیفالټ په واسطه ، یوازې د پوسټګریس کارونکي د پوسټګریس کیل ډیټابیس ته لاسرسی لري او یوازې په محلي توګه. دا لارښود موږ ته اجازه راکوي چې د دې کارونکي په استازیتوب امرونه اجرا کړو (که موږ لاسرسی ولرو، البته).
همچنان ، تاسو ممکن pg_hba.conf ته یوه کرښه اضافه کړئ ترڅو ډیټابیس ته نوي کارونکي لاسرسي ته اجازه ورکړئ. دا په ورته ډول ترسره کیدی شي لکه څنګه چې موږ د نګینکس ترتیب بدل کړی.

او البته، تاسو اړتیا لرئ د اصلي لوبې کتاب کې د پوسټګریسکیل رول اضافه کړئ.

د rbenv له لارې روبي نصب کول

Ansible د rbenv سره کار کولو لپاره ماډلونه نلري، مګر دا د ګیټ ذخیره کلون کولو سره نصب شوی. له همدې امله، دا ستونزه تر ټولو غیر معیاري شي. راځئ چې د هغې لپاره یو رول جوړ کړو /ansible/roles/ruby_rbenv/main.yml او راځئ چې دا ډکول پیل کړو:

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

موږ بیا د دې هدفونو لپاره رامینځته شوي کارن لاندې کار کولو لپاره د become_user لارښود کاروو. ځکه چې rbenv په خپل کور لارښود کې نصب شوی، او په نړیواله کچه نه. او موږ د ذخیره کولو کلون کولو لپاره د git ماډل هم کاروو ، د ریپو او ډیسټ مشخص کول.

بیا، موږ اړتیا لرو چې په bashrc کې rbenv init راجستر کړو او هلته PATH ته rbenv اضافه کړو. د دې لپاره موږ د 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 -)"'

بیا تاسو اړتیا لرئ ruby_build نصب کړئ:

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

او په پای کې روبي نصب کړئ. دا د rbenv له لارې ترسره کیږي، دا په ساده ډول د 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

موږ وایو چې کوم حکم باید عملي شي او په څه سره. په هرصورت، دلته موږ د دې حقیقت سره مخ شو چې ansible د کمانډونو چلولو دمخه په bashrc کې موجود کوډ نه چلوي. دا پدې مانا ده چې rbenv باید په مستقیم ډول په ورته سکریپټ کې تعریف شي.

بله ستونزه د دې حقیقت له امله ده چې د شیل کمانډ د ځواب ویلو له نظره هیڅ حالت نلري. دا دی، هیڅ اتوماتیک چک به نه وي چې آیا د روبي دا نسخه نصب شوې که نه. موږ دا پخپله کولی شو:

- 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

ټول هغه څه چې پاتې دي د بنډلر نصب کول دي:

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

او بیا، زموږ رول ruby_rbenv په اصلي لوبو کتاب کې اضافه کړئ.

شریک شوي فایلونه

په عموم کې، ترتیب دلته بشپړ کیدی شي. بیا ، ټول هغه څه چې پاتې دي د کیپسټرانو چلول دي او دا به پخپله کوډ کاپي کړي ، اړین لارښودونه رامینځته کړي او غوښتنلیک لانچ کړي (که هرڅه سم تنظیم شوي وي). په هرصورت، capistrano ډیری وختونه اضافي ترتیباتو فایلونو ته اړتیا لري، لکه database.yml او یا .env دوی د نګینکس لپاره د فایلونو او ټیمپلیټونو په څیر کاپي کیدی شي. یوازې یو لنډیز شتون لري. د فایلونو کاپي کولو دمخه ، تاسو اړتیا لرئ د دوی لپاره لارښود جوړښت رامینځته کړئ ، داسې یو څه:

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

موږ یوازې یو لارښود مشخص کوو او ځواب ورکوونکی به په اوتومات ډول والدین رامینځته کړي که اړتیا وي.

ځواب وړ والټ

موږ دمخه پدې حقیقت کې راغلي یو چې متغیرات کولی شي پټ معلومات ولري لکه د کارونکي پټنوم. که تاسو جوړ کړی وي .env د غوښتنلیک لپاره فایل، او database.yml بیا باید داسې نور مهم معلومات شتون ولري. دا به ښه وي چې دوی د تورو سترګو څخه پټ کړئ. د دې هدف لپاره کارول کیږي ځواب وړ والټ.

راځئ چې د متغیرونو لپاره فایل جوړ کړو /ansible/vars/all.yml (دلته تاسو کولی شئ د کوربه مختلف ګروپونو لپاره مختلف فایلونه رامینځته کړئ ، لکه د لیست فایل کې: production.yml, staging.yml, etc).
ټول متغیرونه چې باید کوډ شوي وي باید د معیاري yml ترکیب په کارولو سره دې فایل ته لیږدول شي:

# 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

له هغې وروسته دا فایل د کمانډ سره کوډ کیدی شي:

ansible-vault encrypt ./vars/all.yml

په طبیعي ډول ، کله چې کوډ کول ، تاسو اړتیا لرئ د کوډ کولو لپاره پټنوم تنظیم کړئ. تاسو کولی شئ وګورئ چې د دې کمانډ زنګ وهلو وروسته به د فایل دننه څه وي.

د مرستې په مرسته ansible-vault decrypt فایل کوډ کولی شي، ترمیم شي او بیا بیا کوډ شي.

تاسو اړتیا نلرئ د کار کولو لپاره فایل ډیکریټ کړئ. تاسو دا کوډ شوی ذخیره کړئ او د دلیل سره د لوبې کتاب چل کړئ --ask-vault-pass. ځواب ورکوونکي به د پټنوم غوښتنه وکړي، متغیرات بیرته ترلاسه کړي، او دندې اجرا کړي. ټول معلومات به کوډ شوي پاتې شي.

د کوربه او ځواب وړ والټ ډیری ډلو لپاره بشپړ کمانډ به داسې ښکاري:

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

مګر زه به تاسو ته د لوبو کتابونو او رولونو بشپړ متن نه درکوم ، پخپله یې ولیکئ. ځکه چې ځواب ورکوونکی ورته دی - که تاسو نه پوهیږئ چې څه باید ترسره شي، نو دا به ستاسو لپاره ونه کړي.

سرچینه: www.habr.com

Add a comment