مدیریت وضعیت مطلوب با Ansible
در این درس ۵ بخش
پس از دورهٔ مقدماتی و درس Bash، میتوانی مراحل انجام کار را بنویسی؛ حالا میخواهیم وضعیت مطلوب را تعریف کنیم. فرض کن سه ماشین باید فایل یکسانی با مجوز مشخص داشته باشند. اسکریپت، ترتیب فرمانها را اجرا میکند؛ ابزار مدیریت پیکربندی، وضعیت موجود را با مقصد مقایسه و تفاوت لازم را اعمال میکند. محیط پیشنهادی Ubuntu 24.04 LTS، Bash و Python 3 است. فقط localhost را مدیریت میکنیم و SSH یا sudo نداریم. نتیجهٔ قابل تحویل، inventory، playbook و مدرک اجرای دوم بدون تغییر است. این آزمایش یک سرویس واقعی نصب یا راهاندازی نمیکند؛ فایل service.conf فقط دادهٔ آموزشی زیر خانهٔ توست.
تکرارپذیری با پنهانکردن تغییر فرق دارد
Idempotence یعنی اجرای دوباره با ورودی یکسان، پس از رسیدن به وضعیت مطلوب، تغییر تازهای ایجاد نکند. اگر هر بار یک سطر به فایل اضافه کنی، شرط برقرار نیست. نوشتن changed_when: false روی چنین فرمانی، فقط گزارش را عوض میکند. ما از ماژولهای file، copy و template استفاده میکنیم: اولی وضعیت پوشه و مجوز، دومی محتوای ثابت، و سومی محتوای وابسته به متغیر را مدیریت میکند. نام کامل ansible.builtin ابهام مجموعهها را کم میکند. مجوزها را بهشکل رشته مینویسیم تا YAML عدد را به مبنای نامناسب تفسیر نکند؛ مالکیت را به کاربر اجراکننده میسپاریم.
محیط و فایلهای پروژه
umask 077
LAB14=$(mktemp -d "$HOME/linux2-ansible.XXXXXX") || exit 1
export LAB14
mkdir -- "$LAB14/project" "$LAB14/target"
printf '[lab]\nlocalhost ansible_connection=local\n' > "$LAB14/project/inventory.ini"
printf 'Training files only.\n' > "$LAB14/project/README.txt"
cat > "$LAB14/project/service.conf.j2" <<'TEMPLATE'
port={{ service_port }}
mode=training
TEMPLATE
# Optional installation in an isolated venv, following the official guide:
# python3 -m venv "$LAB14/venv"
# "$LAB14/venv/bin/python" -m pip install ansible-core
# export PATH="$LAB14/venv/bin:$PATH"ابتدا پوشهٔ target را با Bash ساختیم تا پیشنمایش اولیه با مسئلهٔ والدِ هنوز ایجادنشده روبهرو نشود؛ check mode زنجیرهٔ همهٔ تغییرات آینده را واقعاً ایجاد نمیکند. متن YAML بعدی را دقیقاً در مسیر $LAB14/project/site.yml ذخیره کن. inventory گروه lab و اتصال محلی را تعیین میکند. gather_facts: false جمعآوری اطلاعات اضافی را کنار میگذارد و become: false درخواست افزایش دسترسی را غیرفعال میکند. guard نخست مانع اجرای اتفاقی با متغیر خالی یا مقصدی بیرون از الگوی تمرین میشود. همچنان فقط پوشهٔ تازهساختهٔ خودت را به LAB14 بده؛ این کنترل جای اعتبارسنجی جامع مسیر در محصول عمومی نیست.
---
- name: Manage an isolated local training directory
hosts: lab
gather_facts: false
become: false
vars:
lab_root: "{{ lookup('ansible.builtin.env', 'LAB14') }}"
target: "{{ lab_root }}/target"
service_port: 8080
tasks:
- name: Require the isolated home workspace
ansible.builtin.assert:
that:
- lab_root | length > 0
- lab_root.startswith(lookup('ansible.builtin.env', 'HOME') + '/linux2-ansible.')
- lab_root is directory
- name: Keep the target directory private
ansible.builtin.file:
path: "{{ target }}"
state: directory
mode: '0700'
- name: Publish the static readme
ansible.builtin.copy:
src: README.txt
dest: "{{ target }}/README.txt"
mode: '0600'
- name: Render the desired service configuration
ansible.builtin.template:
src: service.conf.j2
dest: "{{ target }}/service.conf"
mode: '0600'پیشنمایش، اجرا و سنجش تغییر
command -v ansible-playbook || exit 1
ansible-playbook -i "$LAB14/project/inventory.ini" "$LAB14/project/site.yml" --syntax-check
ansible-playbook -i "$LAB14/project/inventory.ini" "$LAB14/project/site.yml" --check --diff
ansible-playbook -i "$LAB14/project/inventory.ini" "$LAB14/project/site.yml"
ansible-playbook -i "$LAB14/project/inventory.ini" "$LAB14/project/site.yml"
ansible-playbook -i "$LAB14/project/inventory.ini" "$LAB14/project/site.yml" -e service_port=8081 --check --diff
cat "$LAB14/target/service.conf"پیشنیاز عملی، Ansible سازگار با Python دستگاه است. اگر نصب نیست، از راهنمای رسمی نصب استفاده کن؛ یک محیط مجازی جدا زیر پوشهٔ تمرین و بستهٔ ansible-core برای این ماژولها کافی است. نصب را با sudo pip یا اسکریپت ناشناس انجام نده. این صفحه چیزی را خودکار نصب نمیکند. با اجرای فرمانها، بررسی نحو باید موفق باشد؛ اجرای نخست فایلها را میسازد و اجرای دوم، در نبود تغییر بیرونی، باید changed=0 گزارش کند. پیشنمایشِ port برابر 8081 تغییر template را نشان میدهد، ولی cat باید هنوز port=8080 را بخواند. برای اعمال تغییر، همان فرمان را بدون --check اجرا کن.
check mode شبیهسازی وابسته به پشتیبانی ماژول است؛ اثبات سالمبودن یک سامانه یا جایگزین اجرای آزمایشی نیست. هر سه ماژول مدیریت فایل این درس از آن پشتیبانی میکنند، اما وظیفهای که به نتیجهٔ مرحلهٔ اجرانشده وابسته باشد ممکن است پیشبینی کاملی نداشته باشد. --diff اختلاف پیش و پس را نشان میدهد؛ روی دادهٔ واقعی ممکن است رمز یا کلید را وارد خروجی کند. این تمرین فقط اطلاعات ساختگی دارد. در پروژهٔ حساس، نمایش اختلاف و ثبت خروجی را با سیاست داده هماهنگ کن و اسرار را در فایل نمونه، Git یا گزارش عمومی قرار نده.
اسکریپت، زمانبند و مدیریت پیکربندی
Bash برای جریان کاری کوچک، تبدیل داده و اتصال ابزارها مناسب است. Ansible برای تعریف وضعیت فایلها و پیکربندی چند مقصد، ورودی و گزارش ساختاریافته میدهد. cron یا systemd timer تعیین میکند چه زمانی یک کار اجرا شود؛ هیچکدام جای تعریف وضعیت مطلوب نیست. حتی playbook خوب نیز بدون inventory روشن و محدودهٔ اجرا میتواند ماشین اشتباه را تغییر دهد. در گسترش آینده، ابتدا یک ماشین آزمایشی، سپس گروه کوچک و بعد بقیهٔ مقصدها را انتخاب کن. این درس عمداً به localhost محدود است تا مدل تغییر را پیش از مدیریت راه دور بفهمی.
تمرین و پاسخ
تمرین: پس از اجرای موفق، مقدار port فایل مقصد را دستی به 9999 تغییر بده. آیا اجرای بعدی باید changed=0 باشد؟ پاسخ: نه؛ template انحراف را میبیند و مقدار مطلوب 8080، یا مقدار صریحی که با -e دادهای، را برمیگرداند. سپس اجرای دوباره باید بدون تغییر باشد. برای تحویل، خروجی خلاصهٔ دو اجرا و پیشنمایش تغییر پورت را نگه دار و توضیح بده کدام فایل ثابت و کدام فایل قالب است. اگر تغییر پورت هر بار گزارش میشود، ورودیهای متغیر مانند زمان جاری را بررسی کن؛ وضعیت مطلوبِ متغیر در هر اجرا، آزمون تکرارپذیری را بیمعنا میکند.
منابع رسمی انگلیسی:
Ansible — Installing Ansible: https://docs.ansible.com/projects/ansible/latest/installation_guide/intro_installation.html
Ansible — Check mode and diff mode: https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_checkmode.html
Ansible — file module: https://docs.ansible.com/projects/ansible/latest/collections/ansible/builtin/file_module.html
Ansible — copy module: https://docs.ansible.com/projects/ansible/latest/collections/ansible/builtin/copy_module.html
Ansible — template module: https://docs.ansible.com/projects/ansible/latest/collections/ansible/builtin/template_module.html
تألیف و مثالهای اختصاصی: تحریریه درسآوند. منابع رسمی انگلیسی برای مطالعهٔ تکمیلی معرفی شدهاند.
متن درسهای عمومی را بدون ورود بخوانید.