问题描述
提出了关于使用Ansible时的几个问题,以下是这些问题的内容:
问题1:Ansible在连接远程主机时使用哪个Shell?
问题2:如果我在一个playbook中有10个任务,Ansible会针对每个任务都进行一次远程主机连接吗?
问题3:如果我在两台主机上运行10个任务,Ansible的连接是如何持续的?
下面将逐个问题进行解答。
解决方案
问题1:Ansible使用哪个Shell连接到远程主机?
默认情况下,Ansible会使用/bin/sh
作为连接远程主机时的Shell。在许多*nix系统中,包括RHEL / CentOS,/bin/sh
是bash
。但是,在Ubuntu / Debian等系统上,默认的/bin/sh
是dash
,它相对基本。
如果你希望Ansible使用其他Shell,你可以通过全局配置或在playbook中指定executable
选项来实现。然而,在实践中,有人发现在ansible.cfg
中设置executable
选项并不起作用。相反,可以在每个任务中使用executable
选项来指定Shell,例如:
- name: Run command with bash
shell: echo hello from $0
args:
executable: /bin/bash
这将在远程主机上执行命令,并在命令中使用bash作为Shell。
问题2:Ansible对每个任务都进行一次远程主机连接吗?
在大多数情况下,是的。例如,对于每个任务,Ansible通常会建立一个SCP或SFTP连接来复制远程执行的任务文件,然后再建立另一个连接来触发脚本执行。你可以通过使用-vvv
选项运行playbook来监视连接情况。在执行playbook时,可以使用以下命令:
ansible-playbook deploy_app.yml -u maplebird -vvv
第三级的详细程度将显示所有与客户端的连接。
问题3:Ansible在多台主机上的任务执行顺序和连接是如何处理的?
默认情况下,Ansible会并发地在所有主机上执行任务,数量不超过配置中的最大forks数。这意味着它将在所有主机上同时运行任务1,然后再运行任务2,依此类推。Forks数在ansible.cfg
中定义,默认为5。你可以将此变量的值更改为更高的数字,或者注释掉它。
此外,你还可以在playbook中使用serial
选项,以满足一次只对少数主机并发执行任务的需求。例如,以下是一个在playbook中使用serial
选项的示例:
- name: Deploy to all webservers
hosts: webservers
serial: 2
roles:
- deploy_application
在上述示例中,使用serial: 2
选项,Ansible将同时在2个主机上并发执行任务,然后再在另外2个主机上执行,以此类推。
更多阅读材料:
希望这些解答能够帮助你理解Ansible在连接远程主机时的工作方式。如果你还有其他问题,欢迎继续提问。