Accelerated Mode

New in version 1.3.

你也许不需要这个!

你在使用 Ansible 1.5 或者 之后的版本吗? 如果是的话,因为被称之为 “SSH pipelining” 的新特性,你也许就不需要加速模式了.详情请阅读:ref:pipelining 部分的章节.

对于使用 1.5 及之后版本的用户,加速模式只在以下情况下有用处: (A) 管理红帽企业版 Linux 6 或者更早的那些依然使用 paramiko 的版本 或者 (B) 像在文档中描述的那样:无法在 TTYs 中使用 sudo.

如果你能够使用pipelining,Ansible 将会降低通过 wire 传输文件的总量来提升有效率,并且在几乎所有情况下(甚至可能包括了传输大型文件)都能与加速模式相匹敌.归功于更少的移动文件块,管道几乎在所有的情况下优于加速模式.

加速模式将为了支持那些仍使用红帽企业版 Linux 6 做主控机或因其他环境因素受限制而保留.

加速模式详解

尽管 OpenSSH 使用的 ControlPersist 特性既快速又可伸缩,但这会在 SSH 连接时造成少量的开销.虽然很多人不会遇到这样一个需求,但是如果你当前运行的平台不支持 ControlPersist (如 一台 EL6 control machine), 你大概会对 tuning 选项更感兴趣.

加速模式只是使用来加速连接的,它仍需使用 SSH 来进行初始安全密钥交换.它没有额外增加需要管理的基础设施的公共key,也不需要诸如 NTP 或 DNS.

加速模式在任何情况下将比启用 ControlPersist 特性的 SSH 快2-6倍,10倍于 paramiko.

加速模式通过启动一个临时的 SSH 守护进程来工作.只要这个守护进程在运行,Ansible 将会直接通过 socket 来连接.Ansible 通过在连接时交换临时的 AES key 来确保安全(这个秘钥对每个主机都是不同的并且会定期重新生成).

默认配置下,Ansible 会为加速模式开启5099端口(此配置可修改).一旦运行了,守护进程将会维持连接 30 分钟,过了时限后该连接将会自动终结,你需要重启一个 SSH.

加速模式对它所基于的 fireball 模式(已被废弃)做了许多改进:

  • 不需要 bootstrapping,仅需在你想要运行加速模式的playbook上添加一行代码.
  • 支持 sudo 命令(下文参见详情)
  • 更少的依赖需求.ZeroMQ 不在需要,除了 python-keyczar 外再无其他依赖包需要安装.
  • Python 版本必须大于等于 2.5

只需在你的 play 中添加 accelerate: true 即可使用加速模式:

---

- hosts: all
  accelerate: true

  tasks:

  - name: some task
    command: echo {{ item }}
    with_items:
    - foo
    - bar
    - baz

如果你希望改变 Ansible 用于加速模式的端口,你只需添加 accelerated_port 选项:

---

- hosts: all
  accelerate: true
  # default port is 5099
  accelerate_port: 10000

accelerate_port 选项也同样能通过指定环境变量 ACCELERATE_PORT 或者在你的 ansible.cfg 中配置:

[accelerate]
accelerate_port = 5099

如先前所述,加速模式同样支持通过 sudo 命令来运行任务.但是有两点需要予以提醒:

  • 你必须移除 sudoers 选项中的 requiretty.
  • 目前仍不支持 sudo 密码提示,所以 NOPASSWD 选项是必须的.

如果是 Ansible 版本是 1.6,你同样可以允许多个连接多个秘钥来连接多个 Ansible 管理节点.你可以通过在你的 ansible.cfg 中添加如下配置:

accelerate_multi_key = yes

当启用时,守护进程将会打开一个 UNIX socket 文件(默认位于 $ANSIBLE_REMOTE_TEMP/.ansible-accelerate/.local.socket).来自 SSH 的新的连接能够通过这个 socket 文件来上载新的秘钥给守护进程.