关于Ansible连接到远程主机的问题

276次阅读
没有评论

问题描述

提出了关于使用Ansible时的几个问题,以下是这些问题的内容:

问题1:Ansible在连接远程主机时使用哪个Shell?

问题2:如果我在一个playbook中有10个任务,Ansible会针对每个任务都进行一次远程主机连接吗?

问题3:如果我在两台主机上运行10个任务,Ansible的连接是如何持续的?

下面将逐个问题进行解答。

解决方案

问题1:Ansible使用哪个Shell连接到远程主机?

默认情况下,Ansible会使用/bin/sh作为连接远程主机时的Shell。在许多*nix系统中,包括RHEL / CentOS,/bin/shbash。但是,在Ubuntu / Debian等系统上,默认的/bin/shdash,它相对基本。

如果你希望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在连接远程主机时的工作方式。如果你还有其他问题,欢迎继续提问。

正文完