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 檔案來上載新的祕鑰給守護程序.