使用Ansible打开交互式会话

96次阅读
没有评论

问题描述

在使用Ansible时,用户想知道是否有一种相对简便的方法来打开交互式会话。用户已经花了很多时间来管理密钥和其他凭证,以创建一个优秀的Ansible清单文件。然而,当用户想要登录那些容易管理的服务器时,不得不去查找这些凭证,并花费时间登录到服务器上。用户认为,相对于通过SSH登录,使用Ansible运行adhoc命令似乎更容易。用户想知道是否有一种方法可以在Ansible中暂停,以便在运行交互式会话时获得命令提示符。用户注意到有时Ansible允许他们接受主机密钥,但其他情况下可能会失败(用户认为这可能与运行SSH代理有关),所以他们知道可以进行交互式操作。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1:使用ansible-console

你可以尝试使用 ansible-console 命令来实现交互式会话。它让你感觉像是在一个打开的 shell 中操作一样,除非你使用Ansible任务名称作为命令,这种情况下,你可以使用 shell 模块来运行命令。

ansible-console

ansible-console 中,你可以运行Ansible任务,也可以使用 shell 模块来运行命令。

方案2:编写自定义脚本

如果你希望更加自定义,可以编写一个脚本来实现交互式会话。以下是一个示例脚本,它可以根据用户提供的主机模式匹配规则,连接到匹配的主机并打开交互式会话。请注意,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。

#!/bin/bash
set -e

if [ -z "$1" ]; then
  echo "未提供主机模式。请提供一个只匹配清单中一个主机的主机模式。"
  echo "用法: ansible-ssh <host_pattern>"
  echo "示例: ./ansible-ssh services[0]"
  exit 1
fi

USER=sysadm
HOST_PATTERN=$1
HOST=$(ansible -m shell -a "echo {{ groups.$HOST_PATTERN }}" localhost | sed 1d)

if grep -q "\[.*\]" <<< "$HOST"; then
  echo "主机模式 $HOST_PATTERN 匹配了多个主机: $HOST"
  exit 1
fi

echo "连接到 $USER@$HOST..."
ssh $USER@$HOST

在上面的示例中,你需要修改 USER 为你的默认用户名(例如,sysadm),然后执行以下命令来连接到匹配的主机并打开交互式会话:

./ansible-ssh services[0]

其中,services 是你清单中一个或多个主机的分组。

方案3:使用SSH配置文件和包装脚本

还有一种方法是使用一个Ansible的playbook和一个Python脚本,它会处理Ansible用于连接主机的变量(特别是 ansible_ssh_common_args),并生成用于连接主机的SSH配置文件和包装脚本。这种方法可以在交互式会话中使用Ansible的变量,实现较为灵活的设置。你可以在以下链接中找到详细的解释和源代码:
https://dmrub.github.io/ansible/ssh/2020/10/17/interactive-ssh-with-ansible.html
源代码可以在GitHub上找到:
https://github.com/dmrub/ansible-ssh-scripts-creator

请根据你的需求选择合适的方法来实现交互式会话。

正文完