我怎样才能使 ansible 重用 SSH 会话而不是为每个任务创建一个新会话?
How can I make ansible reuse SSH sessions instead of creating a new one for each task?
我的公司防火墙策略只允许同一源和目标之间每分钟 60 秒 20 个连接。
由于这个原因,ansible play 会在一段时间后挂起。
我希望多个任务使用同一个 ssh 会话而不是创建新会话。为此,我在本地文件夹 ansible.cfg
以及命令行中设置了以下 pipelining = True
。
cat /opt/automation/startservices/ansible.cfg
[defaults]
host_key_checking = False
gathering = smart
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=600s
control_path = %(directory)s/%%h-%%r
pipelining = True
ANSIBLE_SSH_PIPELINING=0 ansible-playbook -i /opt/automation/startservices/finalallmw.hosts /opt/automation/startservices/va_action.yml -e '{ dest_host: myremotehost7 }' -e dest_user=oracle
剧本太大,无法在此处共享,但这是循环的任务,由于 60 秒内超过 20 个 ssh 连接,它挂起。
- name: Copying from "{{ inventory_hostname }}" to this ansible server.
synchronize:
src: "{{ item.path }}"
dest: "{{ playbook_dir }}/homedirbackup/{{ inventory_hostname }}/{{ dtime }}/"
mode: pull
copy_links: yes
with_items:
- "{{ to_copy.files }}"
设置流水线设置后,我的播放在 20 个连接后仍然挂起。
以下是剧本设置:
hosts: "{{ groups['dest_nodes'] | default(groups['all']) }}"
user: "{{ USER | default(dest_user) }}"
any_errors_fatal: True
gather_facts: false
tags: always
vars:
ansible_host_key_checking: false
ansible_ssh_extra_args: -o StrictHostKeyChecking=no -o ConnectionAttempts=5
Post 在此线程上到目前为止的建议问题仍然存在。下面是我的本地目录ansible.cfg
$ cat /opt/automation/startservices/ansible.cfg
# config file for ansible -- http://ansible.com/
# ==============================================
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first
[defaults]
host_key_checking = False
roles_path = roles/
gathering = smart
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=1200s -o ControlPath=~/.ansible/cp/%r@%h:%p
[persistent_connection]
control_path_dir = ~/.ansible/cp
$
对于所有任务都使用相同的 ssh 会话并且流水线在这里不起作用的可靠方面的问题,您能否提出任何解决方案?
首先:pipelining = True
没有做您正在寻找的事情。它减少了网络操作的数量,但没有减少 ssh 连接的数量。查看 docs 了解更多信息。
恕我直言,使用它仍然是一件好事,因为它会加快你的剧本。
您要使用的是“持久控制模式”,这是 OpenSSH 保持连接打开的一个特性。
例如,您可以在 ansible.cfg
:
中执行此操作
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=1200
这将使连接保持打开状态 1200 秒。
问题不在于 ansible 控制器 运行 模块(即将必要的临时 AnsibleZ 文件复制到您的目标并执行它们 - 您已经在 ansible.cfg
使用主会话)但是 synchronize
模块本身需要生成自己的 ssh 连接以在目标上 运行 时在相关服务器之间传输文件。
最新的 synchronize
module version is now part of the ansible.posix
collection 并且最近获得了 2 个选项,它们将帮助您解决在使用 rsync 时将主会话的使用应用于模块本身的问题。
虽然可以在 ansible 2.9 中安装此集合以覆盖 older stock module version(没有这些选项),但我强烈建议您使用 ansible 版本 2.10 或 2.11。我个人首选的ansible安装方法是通过pip
,因为它可以让你在任何OS上为任何数量(虚拟)环境中的任何用户安装任何ansible版本。
关于 pip,versioning has changed(在我看来是一团糟...)
ansible
现在是一个具有独立版本控制的元包。
- 通常的 ansible 二进制文件(
ansible
、ansible-playbook
、....)打包在 ansible-core
中,其版本与 [=62= 时获得的版本相对应] ansible -v
- meta
ansible
包默认安装一组集合(如果我没记错的话,包括 ansible.posix
一个)
=> 要获得 ansible -v => 2.10
你要安装 ansible pip 包 3.x
=> 要获得 ansible -v => 2.11
你要安装 ansible pip 包 4.x
在继续之前,您必须删除当前环境中通过 pip 安装的任何先前版本。
我的公司防火墙策略只允许同一源和目标之间每分钟 60 秒 20 个连接。
由于这个原因,ansible play 会在一段时间后挂起。
我希望多个任务使用同一个 ssh 会话而不是创建新会话。为此,我在本地文件夹 ansible.cfg
以及命令行中设置了以下 pipelining = True
。
cat /opt/automation/startservices/ansible.cfg
[defaults]
host_key_checking = False
gathering = smart
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=600s
control_path = %(directory)s/%%h-%%r
pipelining = True
ANSIBLE_SSH_PIPELINING=0 ansible-playbook -i /opt/automation/startservices/finalallmw.hosts /opt/automation/startservices/va_action.yml -e '{ dest_host: myremotehost7 }' -e dest_user=oracle
剧本太大,无法在此处共享,但这是循环的任务,由于 60 秒内超过 20 个 ssh 连接,它挂起。
- name: Copying from "{{ inventory_hostname }}" to this ansible server.
synchronize:
src: "{{ item.path }}"
dest: "{{ playbook_dir }}/homedirbackup/{{ inventory_hostname }}/{{ dtime }}/"
mode: pull
copy_links: yes
with_items:
- "{{ to_copy.files }}"
设置流水线设置后,我的播放在 20 个连接后仍然挂起。
以下是剧本设置:
hosts: "{{ groups['dest_nodes'] | default(groups['all']) }}"
user: "{{ USER | default(dest_user) }}"
any_errors_fatal: True
gather_facts: false
tags: always
vars:
ansible_host_key_checking: false
ansible_ssh_extra_args: -o StrictHostKeyChecking=no -o ConnectionAttempts=5
Post 在此线程上到目前为止的建议问题仍然存在。下面是我的本地目录ansible.cfg
$ cat /opt/automation/startservices/ansible.cfg
# config file for ansible -- http://ansible.com/
# ==============================================
# nearly all parameters can be overridden in ansible-playbook
# or with command line flags. ansible will read ANSIBLE_CONFIG,
# ansible.cfg in the current working directory, .ansible.cfg in
# the home directory or /etc/ansible/ansible.cfg, whichever it
# finds first
[defaults]
host_key_checking = False
roles_path = roles/
gathering = smart
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=1200s -o ControlPath=~/.ansible/cp/%r@%h:%p
[persistent_connection]
control_path_dir = ~/.ansible/cp
$
对于所有任务都使用相同的 ssh 会话并且流水线在这里不起作用的可靠方面的问题,您能否提出任何解决方案?
首先:pipelining = True
没有做您正在寻找的事情。它减少了网络操作的数量,但没有减少 ssh 连接的数量。查看 docs 了解更多信息。
恕我直言,使用它仍然是一件好事,因为它会加快你的剧本。
您要使用的是“持久控制模式”,这是 OpenSSH 保持连接打开的一个特性。
例如,您可以在 ansible.cfg
:
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=1200
这将使连接保持打开状态 1200 秒。
问题不在于 ansible 控制器 运行 模块(即将必要的临时 AnsibleZ 文件复制到您的目标并执行它们 - 您已经在 ansible.cfg
使用主会话)但是 synchronize
模块本身需要生成自己的 ssh 连接以在目标上 运行 时在相关服务器之间传输文件。
最新的 synchronize
module version is now part of the ansible.posix
collection 并且最近获得了 2 个选项,它们将帮助您解决在使用 rsync 时将主会话的使用应用于模块本身的问题。
虽然可以在 ansible 2.9 中安装此集合以覆盖 older stock module version(没有这些选项),但我强烈建议您使用 ansible 版本 2.10 或 2.11。我个人首选的ansible安装方法是通过pip
,因为它可以让你在任何OS上为任何数量(虚拟)环境中的任何用户安装任何ansible版本。
关于 pip,versioning has changed(在我看来是一团糟...)
ansible
现在是一个具有独立版本控制的元包。- 通常的 ansible 二进制文件(
ansible
、ansible-playbook
、....)打包在ansible-core
中,其版本与 [=62= 时获得的版本相对应]ansible -v
- meta
ansible
包默认安装一组集合(如果我没记错的话,包括ansible.posix
一个)
=> 要获得 ansible -v => 2.10
你要安装 ansible pip 包 3.x
=> 要获得 ansible -v => 2.11
你要安装 ansible pip 包 4.x
在继续之前,您必须删除当前环境中通过 pip 安装的任何先前版本。