当前位置:首页 > 技术 > 正文内容

Ansible 性能调优与异步执行机制详解

访客 技术 2026年6月13日 1

Ansible 性能调优策略

在默认配置下,Ansible 能够应对常规的自动化运维需求。然而,当管理节点规模达到数百甚至上千台时,默认参数会导致执行效率显著下降。通过调整核心配置文件和 Playbook 执行策略,可以大幅提升 Ansible 的吞吐量与响应速度。

1. 核心配置文件优化 (ansible.cfg)

通过修改 ansible.cfg,可以从全局层面改善 Ansible 的运行表现。

提升并发处理能力

Ansible 默认使用 5 个并行进程(forks)来管理目标主机。在控制节点 CPU 和内存资源充足的情况下,增加该值可以显著缩短批量任务的执行时间。

[defaults]
# 将并发进程数提升至 50,具体数值应根据控制节点的硬件资源进行调整
forks = 50

此外,在命令行执行 Ad-Hoc 临时任务时,也可以通过 -f 参数动态覆盖此设置。

加速 SSH 连接

SSH 连接的建立和验证过程会消耗大量时间,可以通过以下配置进行优化:

  • 禁用主机密钥检查:避免每次连接时读取和验证 known_hosts 文件,消除交互式提示。
  • 启用 Pipelining:减少 SSH 连接次数,直接将脚本通过标准输入传递给远程 Python 解释器,而不是先通过 SFTP 上传临时文件。
[defaults]
# 关闭 SSH 主机密钥验证
host_key_checking = False

# 开启管道传输。注意:如果目标主机需要 sudo 且 requiretty 被启用,则需关闭此项或修改 sudoers
pipelining = True

Facts 收集与缓存机制

gather_facts 会在 Playbook 执行前收集目标主机的系统信息。如果任务不依赖这些系统变量,禁用它可以节省大量时间。若必须使用,则应引入缓存机制以避免重复收集。

[defaults]
# 禁用默认的 facts 收集
gather_facts = False

# 若需使用 facts,可开启智能收集并配置缓存
gathering = smart
# 缓存有效期设置为 24 小时(秒)
fact_caching_timeout = 86400
# 使用本地 JSON 文件作为缓存后端,生产环境也可替换为 redis 或 memcached
fact_caching = jsonfile
fact_caching_connection = /var/cache/ansible/facts

2. Playbook 执行策略调整

滚动更新 (Serial)

在负载均衡或集群环境中,为了避免所有节点同时下线导致服务中断,可以使用 serial 关键字控制每批次执行的主机数量。

- hosts: web_servers
  # 每次只处理 20% 的主机,或者指定固定数量如 serial: 5
  serial: "20%"
  tasks:
    - name: 重启 Web 服务
      systemd:
        name: nginx
        state: restarted

异步执行与状态轮询

对于耗时较长的任务(如系统内核升级、大数据集同步),同步等待会导致 SSH 连接超时或控制节点资源浪费。通过 asyncpoll 可以将任务放入后台执行。

  • 适用场景:任务执行时间长、无需立即获取结果、批量下发耗时操作。
  • 不适用场景:后续任务强依赖当前任务的输出、任务本身执行极快。

以下是一个重构后的异步任务 Playbook 示例,模拟了长时间运行的数据处理脚本及状态检查逻辑:

- hosts: data_nodes
  # 允许最多 10% 的节点执行失败,超出则中止当前 Play
  max_fail_percentage: 10
  # 每批次处理 15 台主机
  serial: 15
  tasks:
    - name: 触发后台数据同步任务
      shell: |
        /opt/scripts/sync_large_dataset.sh --env production
      # 设置最大允许执行时间为 3600 秒(1小时),超时则标记为失败
      async: 3600
      # 每 30 秒轮询一次状态。设为 0 则表示触发后立刻执行下一个 task(Fire and Forget)
      poll: 30
      register: sync_job_metadata

    - name: 验证后台任务最终状态
      async_status:
        jid: "{{ sync_job_metadata.ansible_job_id }}"
      register: sync_job_status
      # 持续检查直到任务标记为完成
      until: sync_job_status.finished
      # 最多重试 120 次(结合 delay 控制总检查时长)
      retries: 120
      delay: 30

    - name: 清理临时同步日志
      shell: rm -f /tmp/sync_*.log
      when: sync_job_status.finished and sync_job_status.rc == 0

3. 操作系统层面的网络微调

在目标主机的 SSH 服务端,默认可能会开启 DNS 反向解析。这会为每次 SSH 连接增加额外的网络延迟。在确保内网安全的前提下,可以修改目标主机的 /etc/ssh/sshd_config 文件来禁用此特性:

# 修改 sshd 配置,禁用 DNS 反向解析
UseDNS no

# 重启 SSH 服务使配置生效
systemctl restart sshd

结合控制节点使用 time 命令(如 time ansible-playbook site.yml),可以量化评估上述各项优化措施带来的实际性能收益。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。