GH GambleHub

Ansible:配置和丟棄

(部分: 技術和基礎設施)

簡短摘要

Ansible是一種聲明性的配置和編排工具,非常適合在基礎架構(Terraform/IaC)已經建立並需要「振興」環境時重新配置VM/主機,服務和應用程序:安裝軟件包,推出版本,滾動模板,重新啟動服務而無需下線,應用安全策略。成功的關鍵是模塊化結構(角色/集合),嚴格的冪等,整潔的秘密操作(Vault),動態清單,測試和GitOps紀律。

Ansible何時合適(以及如何與Terraform結合)

Terraform-創建資源(VPC、群集、DB)。
Ansible-配置操作系統/軟件、推出版本、驅動遷移、管理文件和服務。
韌帶:Terraform將「inventory」/IP/秘密輸出到工件,Ansible以CD步驟讀取它們。

存儲庫結構(推薦模板)


ansible/
inventories/
prod/
inventory. ini # or inventory. yaml group_vars/
all. yml web. yml db. yml host_vars/
web-01. yml stage/
...
roles/
webapp/
defaults/main. yml vars/main. yml tasks/main. yml handlers/main. yml templates/.j2 files/
meta/main. yml hardening/
...
playbooks/
site. yml deploy_webapp. yml hardening. yml collections/requirements. yml ansible. cfg
ansible.cfg(最低限度):
ini
[defaults]
inventory = inventories/stage/inventory. ini stdout_callback = yaml callbacks_enabled = timer, profile_tasks interpreter_python = auto retry_files_enabled = False forks = 25 host_key_checking = True

庫存: 靜態和動態

靜態(ini):
ini
[web]
web-01 ansible_host=10. 0. 1. 10 web-02 ansible_host=10. 0. 1. 11

[db]
db-01 ansible_host=10. 0. 2. 10

[all:vars]
ansible_user=ansible ansible_ssh_common_args='-o ProxyJump=bastion@1. 2. 3. 4'

動態

使用雲插件(或本機腳本)按標簽拉動主機。環境/標簽變量→ 「group_vars」。

角色和收藏

角色=獨立的重用模塊(任務,文件,模板,標題)。

集合-一組角色/插件/模塊。在'收藏/要求'中捕獲版本泡沫。yml`.

yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix

Playbooks: 同步腳本

通用花花公子的示例:
yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening

- hosts: web become: true roles:
- webapp
「webapp」角色(片段):
yaml roles/webapp/tasks/main. yml
- name: Install packages:
name: ["nginx", "python3-venv"]
state: present

- name: Template configuration template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: "0644"
notify: Restart nginx

- name: unarchive artifact deploy:
src: "{{ webapp_package_url }}"  # артефакт из CI dest: /opt/webapp remote_src: true creates: /opt/webapp/current

- name: Link to the current version of file:
src: "/opt/webapp/releases/{{ release_id }}"
dest: /opt/webapp/current state: link notify: Reload webapp
Handlers:
yaml roles/webapp/handlers/main. yml
- name: Restart nginx service: { name: nginx, state: restarted }

- name: Reload webapp systemd: { name: webapp, state: reloaded, daemon_reload: true }

Jinja2模板和變量

將默認變量存儲在'defaults/main中。yml",敏感的-在Vault中。
使用過濾器(「| to_nice_yaml'」,「| b64encode」,「| default」)和「when」條件。

例如'nginx。conf.j2`:

jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}

秘密: Ansible Vault和秘密經理

用於變量文件加密的Vault ('group_vars/all.vault.yml`).

最好通過適當的模塊從外部管理器(KMS/Secrets Manager/SSM)中讀取秘密,並且僅將鏈接/ARN存儲在Vault中。

加密文件(結構示例):
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
建議:
  • 分割訪問權限:開發人員看到dev/stage, prod只有CI。
  • 啟用機密輪換和訪問審核。

相似性和正確更改

使用模塊(「package」,「user」,「lineinfile」,「template」,「systemd」)代替「shell/command」。
如果未更改任何內容,請標記「噪音」任務「changed_when: false」。
支持角色檢查模式(「--check」)和diff。
對於不穩定的任務:「retries」,「delay」,「until」。

示例:
yaml
- name: Wait for HTTP uri availability:
url: "http://localhost/health"
status_code: 200 register: health retries: 10 delay: 5 until: health. status == 200

生產力: 大型農場和山頂

forks:提高並行性(小心:不要超載目標)。
strategy=free-在不等待鄰居的情況下執行任務。
pipelining = True в `ansible.cfg'減少了RTT。
gather_facts:不需要事實的錯誤。
async/poll用於長期操作;throttle/serial for deploe波。
單項活動的delegate_to和run_once(例如DB遷移)。

零市區模式

滾動丟棄(各占20%)

yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]

Canary

使用「--limit web-canary」(組子集)運行花花公子,檢查指標,然後向整個組推出。

Blue-Green

兩組主機「web_blue」和「web_green」;花花公子準備新浪潮,接下來切換流量(DNS/LB)的社區任務。general.affiliate_lb'/API你的平衡器。

安全性和硬化

Hardening角色:SSH政治,橫幅,沒有NOPASSWD的「sudo」,fayervol,auditd/rsyslog,time-NTP,「fail2ban」。
啟用SELinux/AppArmor,通過模塊管理策略。
堡壘:僅通過跳躍主機將SSH限制為目標(請參閱「ProxyJump」)。
最小化「become:true」;在庫存級別設計RBAC(誰可以運行哪些花花公子)。

Windows和網絡硬件

Windows:「win_」模塊,通過WinRM,PowerShell腳本進行連接-作為最後一個參數。
網絡:「network_cli」/「httpapi」,用於Cisco/Juniper/F5的模塊;原子通過「save_when: changed」。

測試和質量

ansible-lint + yamllint в CI.

Molecule:局部/容器角色測試,等效性檢查(雙運行不變)。
沙箱:單獨的時間清單/VM映像。

示例Molecule(片段):
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default

與CI/CD和GitOps的集成

類型管道:

1.Lint → Syntax check → Molecule.

2.構建應用程序工件。

3.Deploy: `ansible-playbook -i inventories/prod site.yml --limit web --tags deploy`.

4.轉發更改的主機,文物日誌。

步驟示例(概念):
bash ansible-galaxy collection install -r collections/requirements. yml ansible-lint ansible-playbook playbooks/deploy_webapp. yml \
-i inventories/prod/inventory. ini \
-e release_id=${GIT_SHA} --diff

可觀察性和審計

連接呼叫後插件(json/yaml/timer/profile_tasks)-時間和更改報告。
將花花公子日誌保存到集中存儲中。
標記「tags:」任務以進行選擇性啟動並加快調查速度。

iGaming的常見食譜

Noda Web/API:Nginx+systemd-unit,健康檢查,管理員的秘密,roll-restart。
遊戲服務:通過「group_vars」 按區域/tenant分列的configs模式。
支付連接器:對密鑰進行嚴格的沖洗,通過notify重新啟動,後檢查結束點。
ETL-job:使用「cron」模塊部署CronJob腳本,idempotent鎖文件。

監視: 安裝代理(node_exporter/otelcol),自動註冊監控.

反模式

在有模塊的地方使用「shell/command」。
沒有「手持」的花花公子→額外的重啟和服務抖動。
在打開的「group_vars」中存儲秘密。
缺少「serial」/「max_fail_percentage」,因為原始波變薄。
不需要全局「gather_facts: true」和「become: true」。
沒有Molecule測試且沒有「--check」支持的角色。
沒有「async/poll」的長隊阻擋了整個浪潮。

實施支票

1.協調存儲庫框架和命名約定。
2.配置動態清單和基座。
3.發揮角色(webapp/hardening/monitoring)和pin版本的集合。
4.啟用Vault和/或與Secret Manager集成。
5.提供等效性,「--check/--diff」,手柄和標簽。
6.在CI中連接ansible-lint,yamllint,Molecule。
7.描述dploy(滾動/金絲雀/藍綠色)模式和「串行」限制。
8.添加呼號插件、收集日誌、更改報告。
9.記錄跑步和回滾以及事件中的行動。
10.定期舉行比賽日:SSH懸崖,腳趾下降,版本回滾。

三.成果

Ansible關閉了創建的基礎架構和運行銷售之間的「最後一英裏」:快速、安全和可預測的配置和發布更改。Ansible的角色是最低限度的重用單位,動態清單,正確的秘密操作和調整的零中心模式,可幫助iGaming團隊縮短時間到部署時間,減少夜間事件的數量,並保持p99在SLO級別。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

Telegram
@Gamble_GC
開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。