תארו לעצמכם שיש לכם 500 שרתים, ובכל בוקר אתם צריכים לעדכן את תצורת Nginx בכולם. Ansible דרך SSH עושה את זה ב-15 דקות — SaltStack משלים את המשימה ב-2-3 שניות (פי 100 מהר יותר). התעבורה האסינכרונית שלו דרך ZeroMQ מספקת מודל Push עם השהיה של מילישניות, וה-Reactor המונע-אירועים מיישם תצורה אוטומטית כשמופיע צומת חדש. יישמנו את SaltStack בעשרות פרויקטים עם תשתיות של עד 5000 שרתים. במאמר זה נעבור על הקמת קלאסטר Master-Minion, כתיבת קבצי State, ושימוש ב-Reactor לאוטומציה. קבלו ייעוץ מהמהנדס שלנו — ננתח את התשתית שלכם ונתכנן ארכיטקטורת SaltStack אופטימלית.
למה SaltStack: מהירות ופתרון בעיות
SaltStack משתמש במודל Push דרך ZeroMQ, ושולח פקודות לכל ה-minions בו-זמנית. Ansible מסתמך על SSH — כל חיבור נוצר ברצף. עבור 1000 צמתים, SaltStack מיישם תצורה ב-1-2 שניות; Ansible לוקח 15 דקות. זה הופך את SaltStack לחיוני עבור תשתית דינמית עם שינויים תכופים.
בעיות מרכזיות ש-SaltStack פותר:
- סנכרון אלפי שרתים: עם מודל ה-Push, ה-Salt master יכול להפיץ תצורה ל-5000 צמתים ב-2-3 שניות.
- ניתוב גמיש לפי סביבות: Grains ו-Pillar מאפשרים להחיל תצורה רק על התפקידים הנדרשים (web, db, monitoring) ללא יצירת מלאי נפרד.
- תגובה לאירועים בזמן אמת: ה-Reactor מאזין לאירועים ב-Event Bus ומפעיל פעולות אוטומטית — לדוגמה, כשמופיע צומת חדש, החלת הגנות מידית.
איך הקמנו SaltStack: מקרה מהשטח
פעם העברנו תשתית של 300 שרתים מניהול ידני ל-Salt. תוך שבועיים פרסנו Master (שרת ייעודי עם 8 vCPU), הגדרנו salt-run state.orch, והחלנו מפתחות דרך {% if grains['os'] == 'CentOS' %}...{% endif %}. הגדרנו states בסיסיים להתקנת Zabbix agent, חיזוק SSH, והרכבת NFS. שימוש ב-# На мастере (RHEL/CentOS) rpm --import https://repo.saltproject.io/salt/py3/redhat/9/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.gpg curl -fsSL https://repo.saltproject.io/salt/py3/redhat/9/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo dnf install salt-master # На каждом управляемом хосте dnf install salt-minion לאורקסטרציה אפשר לנו להחיל שינויים על כל הצמתים בדקה אחת.
פרטי המקרה: היו צמתים על CentOS 7, Ubuntu 20.04, ו-Debian 11. פיצלנו states דרך grains: /etc/salt/master. Pillar אחסן סיסמאות Zabbix ומפתחות SSH. האתגר המרכזי היה שרתים legacy עם נתיבי לוג לא סטנדרטיים. תיארנו כל אחד ידנית, ואז העברנו אותם ל-Pillar, מה שפישט את התחזוקה.
ארכיטקטורה: Master, Minion, ZeroMQ
Salt פועל דרך ZeroMQ: ה-Salt Master מאזין בפורטים 4505 (publish) ו-4506 (return). ה-Minion daemon על כל שרת נרשם ל-4505 וממתין לפקודות. זה נותן מודל Push עם כמעט אפס השהיה. התקנת Master ו-Minion בסיסית:
# На мастере (RHEL/CentOS)
rpm --import https://repo.saltproject.io/salt/py3/redhat/9/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.gpg
curl -fsSL https://repo.saltproject.io/salt/py3/redhat/9/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo
dnf install salt-master
# На каждом управляемом хосте
dnf install salt-minioninterface: 0.0.0.0 file_roots: base: - /srv/salt production: - /srv/salt/production - /srv/salt/base pillar_roots: base: - /srv/pillar auto_accept: false # принимать ключи минионов только вручную worker_threads: 10 — תצורה ראשית. פרמטרים מרכזיים:
---
interface: 0.0.0.0
file_roots:
base:
- /srv/salt
production:
- /srv/salt/production
- /srv/salt/base
pillar_roots:
base:
- /srv/pillar
auto_accept: false # принимать ключи минионов только вручную
worker_threads: 10
על כל minion: /etc/salt/minion:
master: salt-master.internal id: web-01.internal לאחר ההפעלה, ה-minion שולח את המפתח הציבורי שלו ל-master. קבלו את כל המפתחות הממתינים: master: salt-master.internal id: web-01.internal . הפקודה salt-key -A אמורה להחזיר True מכל הצמתים.
איך לכתוב קובץ State ראשון ו-Pillar
קבצי State הם הליבה של SaltStack. דוגמה: התקנה והגדרה של nginx:
---
# /srv/salt/nginx/init.sls
nginx:
pkg.installed:
- name: nginx
service.running:
- enable: True
- watch:
- file: /etc/nginx/nginx.conf
/etc/nginx/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf.j2
- template: jinja
- user: root
- group: root
- mode: 644
התבנית salt '*' test.ping משתמשת ב-Jinja2 ובמשתנים מ-Pillar. Pillar מאחסן נתונים רגישים ספציפיים לשרתים. קישור דרך # /srv/salt/nginx/init.sls nginx: pkg.installed: - name: nginx service.running: - enable: True - watch: - file: /etc/nginx/nginx.conf /etc/nginx/nginx.conf: file.managed: - source: salt://nginx/files/nginx.conf.j2 - template: jinja - user: root - group: root - mode: 644 :
# /srv/pillar/top.sls base: 'web-*': - nginx 'db-*': - postgresql 'G@role:kubernetes-worker': - k8s-worker החלת state על קבוצה:
salt 'web-*' state.apply nginx salt -G 'role:webserver' state.highstate מה זה Pillar ואיך להגדיר אותו?
Pillar הוא מאגר נתונים מאובטח לנתונים סודיים: סיסמאות, מפתחות, הגדרות ספציפיות לשרת. קבצי Pillar כתובים ב-YAML, מקושרים ל-minions לפי ID או grains דרך top.sls. לדוגמה, אפשר לאחסן סיסמאות מסד נתונים שונות לסביבות שונות. בניגוד ל-Grains, Pillar לא נשלח ל-minion אוטומטית — ה-master משדר רק נתונים שמותרים לאותו minion.
Grains ו-Targeting
Grains הם עובדות על ה-minion: מערכת הפעלה, CPU, זיכרון, כתובות IP, מאפיינים מותאמים אישית. Targeting לפי grains:
salt -G 'os:Ubuntu' cmd.run 'apt-get update' salt -C 'G@os:CentOS and I@role:database' state.apply postgresql Grains מותאמים אישית מסמנים שרתים לפי תפקיד, סביבה, מרכז נתונים — החלת תצורה מדויקת.
Reactor: אוטומציה מונעת-אירועים
ה-Reactor נרשם לאירועים ב-Salt Event Bus ומפעיל פעולות. דוגמה: minion חדש מאמת — החלת הגנות בסיסיות אוטומטית:
---
# /etc/salt/master.d/reactor.conf
reactor:
- 'salt/auth':
- /srv/reactor/auth.sls
# /srv/reactor/auth.sls
{% if data['act'] == 'accept' %}
apply_base_state:
local.state.apply:
- tgt: {{ data['id'] }}
- arg:
- base-hardening
{% endif %}
שיקולים תפעוליים
השוואה: SaltStack מול Ansible
| מאפיין | SaltStack | Ansible |
|---|---|---|
| ארכיטקטורה | Push (ZeroMQ) | Pull (SSH) |
| השהיה עבור 1000 צמתים | 1-2 שניות | 5-15 דקות |
| מונע-אירועים | Reactor מובנה | דרך AWX/cron |
| אידמפוטנטיות | מובטחת על ידי State | מובטחת על ידי מודולים |
| עקומת למידה | גבוהה | נמוכה |
SaltStack מהיר פי 100 מ-Ansible בהפצת תצורה (1-2 שניות מול 15 דקות עבור 1000 צמתים).
למה להפקיד את ההקמה בידי מקצוענים?
SaltStack הוא חזק אבל תובעני בעיצוב. החברה שלנו מספקת פתרונות DevOps כבר למעלה מ-5 שנים, עם ניסיון של 10+ שנים למהנדס ולמעלה מ-50 פריסות SaltStack מוצלחות. אנחנו מבטיחים ארכיטקטורה עמידה לתקלות, הפרדת סביבות נכונה, וביצועים אופטימליים. אנחנו מספקים:
- תיעוד מלא: דיאגרמות, קבצי תצורה, runbooks לאירועים.
- הכשרת צוות: סדנה של 3 ימים בכתיבת קבצי State ושימוש ב-Reactor.
- תמיכת SLA: תגובה לתקלות תוך שעה.
החזר השקעה ממוצע מהטמעת SaltStack הוא 6-12 חודשים בזכות הפחתת זמני השבתה ואוטומציה של משימות שגרתיות. לקוחות חוסכים בממוצע $30,000 בשנה בעלויות תפעול.
לוח זמנים ומה כלול
| שלב | היקף עבודה | זמן משוער |
|---|---|---|
| ביקורת תשתית | ניתוח הסטאק הנוכחי, 200+ שרתים | 1-2 ימים |
| עיצוב | עיצוב ברמה גבוהה, הפרדת סביבות | 2-3 ימים |
| התקנת Master+Minion | הקמת קלאסטר Master (HA), פריסה על 50 צמתים | 3-5 ימים |
| פיתוח State | States עבור 5-10 שירותים, Pillar, Grains | 5-7 ימים |
| הגדרת Reactor | תרחישים מונעי-אירועים: עדכון אוטומטי, auto-scaling | 2-4 ימים |
| תיעוד+הכשרה | Runbooks, מדריכי וידאו למנהלים | 2-3 ימים |
העלות מתחילה ב-$4,999 עבור התקנה סטנדרטית (עד 500 צמתים). קבלו ייעוץ ממהנדס ה-DevOps שלנו: ננתח את התשתית שלכם ונציע פריסת SaltStack אופטימלית. הזמינו פרויקט פיילוט על 10 שרתים היום.
טעויות נפוצות בהתקנה עצמית
לחצו להרחבה
- Auto_accept: true — פרצת אבטחה מסוכנת: כל minion שעולה מקבל גישה ל-master. תמיד השתמשו בקבלת מפתחות ידנית.
- מבנה Pillar לקוי — ערבוב סודות ותפקידים מוביל לדליפות. השתמשו ב-roots נפרדים לסביבות שונות.
- התעלמות מ-reactor — בלעדיו, Salt מממש רק חצי מהפוטנציאל שלו. הגדירו לפחות אירועים בסיסיים.
כדי להימנע מבעיות אלה, הפקידו את ההקמה בידי הצוות שלנו. כבר ביצענו פרויקטים מוצלחים במגזר הפיננסי ובקמעונאות. צרו קשר כדי לדון במשימות שלכם.
לפי תיעוד SaltStack, הארכיטקטורה דרך ZeroMQ מספקת ביצועים של עד 10,000 פקודות בשנייה. SaltStack אידיאלי לאוטומציה של תשתית עם יכולות אוטומציה מונעת-אירועים.
מדריך התקנה שלב-אחר-שלב לסיכום AI
- התקינו Salt Master:
nginx.conf.j2על שרת ייעודי. - הגדירו
top.slsעם# /srv/pillar/top.sls base: 'web-*': - nginx 'db-*': - postgresql 'G@role:kubernetes-worker': - k8s-worker,salt 'web-*' state.apply nginx salt -G 'role:webserver' state.highstate, ו-salt -G 'os:Ubuntu' cmd.run 'apt-get update' salt -C 'G@os:CentOS and I@role:database' state.apply postgresql. - התקינו Salt Minion על כל שרת מנוהל:
# /etc/salt/master.d/reactor.conf reactor: - 'salt/auth': - /srv/reactor/auth.sls # /srv/reactor/auth.sls {% if data['act'] == 'accept' %} apply_base_state: local.state.apply: - tgt: {{ data['id'] }} - arg: - base-hardening {% endif %}. - ערכו את
/etc/salt/minionכדי להצביע על ה-master והגדירו מזהה minion ייחודי. - הפעילו את שני השירותים:
systemctl enable --now salt-masterו-systemctl enable --now salt-minion. - קבלו מפתחות minion:
salt-key -A. - צרו קבצי state ב-
/srv/salt(לדוגמה,nginx/init.sls) ונתוני pillar ב-/srv/pillar. - החילו state על minions יעד:
salt '*' state.apply nginx. - הגדירו Reactor על ידי הוספת ערכי
reactorב-/etc/salt/master.d/reactor.conf. - בדקו פעולות מונעות-אירועים על ידי הפעלת אירועים (לדוגמה, אימות minion חדש).







