ډیر وخت دمخه ما اړتیا درلوده چې د ریل غوښتنلیک پلي کولو لپاره سرور چمتو کولو لپاره څو ځواب ورکوونکي لوبې کتابونه ولیکم. او، په حیرانتیا سره، ما یو ساده ګام په ګام لارښود ونه موندل. زه نه غواړم د بل چا د لوبو کتاب کاپي کړم پرته لدې چې پوه شم چې څه پیښیږي ، او په پای کې ما باید اسناد ولولي ، هرڅه پخپله راټول کړي. شاید زه د دې مقالې په مرسته د یو چا سره د دې پروسې ګړندۍ کولو کې مرسته کولی شم.
د پوهیدو لپاره لومړی شی دا دی چې ځواب ورکوونکي تاسو ته د SSH له لارې په ریموټ سرور (ونو) کې د کړنو دمخه ټاکل شوي لیست ترسره کولو لپاره مناسب انٹرفیس چمتو کوي. دلته هیڅ جادو شتون نلري ، تاسو نشئ کولی پلگ ان نصب کړئ او د بکس څخه بهر د ډاکر ، نظارت او نورو سامانونو سره د خپل غوښتنلیک صفر ډاؤنټایم ګمارنه ترلاسه کړئ. د لوبو کتاب لیکلو لپاره ، تاسو باید پوه شئ چې واقعیا تاسو څه کول غواړئ او څنګه یې وکړئ. له همدې امله زه د GitHub څخه د چمتو شوي لوبو کتابونو څخه راضي نه یم، یا د مقالو لکه: "کاپي او چلول، دا به کار وکړي."
موږ څه ته اړتیا لرو؟
لکه څنګه چې ما مخکې وویل، د لوبې کتاب لیکلو لپاره تاسو اړتیا لرئ پوه شئ چې تاسو څه کول غواړئ او څنګه یې وکړئ. راځئ پریکړه وکړو چې موږ څه ته اړتیا لرو. د ریل غوښتنلیک لپاره موږ به ډیری سیسټم کڅوړو ته اړتیا ولرو: nginx، postgresql (redis، etc). برسېره پردې، موږ د روبي ځانګړي نسخه ته اړتیا لرو. دا غوره ده چې دا د rbenv (rvm، asdf...) له لارې نصب کړئ. د روټ کارونکي په توګه دا ټول چلول تل یو بد نظر دی ، نو تاسو اړتیا لرئ یو جلا کارونکی رامینځته کړئ او د هغه حقونه تنظیم کړئ. له دې وروسته، تاسو اړتیا لرئ چې زموږ کوډ سرور ته اپلوډ کړئ، د nginx، postgres، او نورو لپاره تشکیلات کاپي کړئ او دا ټول خدمتونه پیل کړئ.
د پایلې په توګه، د کړنو ترتیب په لاندې ډول دی:
- د روټ په توګه ننوتل
- د سیسټم کڅوړې نصب کړئ
- یو نوی کارن جوړ کړئ، حقوق تنظیم کړئ، ssh کیلي
- د سیسټم کڅوړې تنظیم کړئ (nginx etc) او دوی یې پرمخ وړئ
- موږ په ډیټابیس کې یو کارن جوړوو (تاسو کولی شئ سمدلاسه ډیټابیس جوړ کړئ)
- د نوي کارونکي په توګه ننوتل
- rbenv او روبي نصب کړئ
- د بنډل نصب کول
- د غوښتنلیک کوډ پورته کول
- د پوما سرور په لاره اچول
سربیره پردې ، وروستي مرحلې د کیپسټرانو په کارولو سره ترسره کیدی شي ، لږترلږه د بکس څخه بهر دا کولی شي کوډ د خوشې کولو لارښودونو کې کاپي کړي ، خوشې کول د بریالي پلي کولو وروسته د سم لینک سره بدل کړي ، د ګډ لارښود څخه کاپي تشکیلات ، پوما بیا پیل کړئ ، او داسې نور. دا ټول د ځواب په کارولو سره ترسره کیدی شي، مګر ولې؟
د فایل جوړښت
ځواب سخت دی
ساده 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