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,我们也会在 Telegram 回复您。
WhatsApp 可选
格式:+国家代码 + 号码(例如:+86XXXXXXXXX)。

点击按钮即表示您同意数据处理。