9

我有一个安装手册,它采用新安装的 linux 实例,以默认用户身份登录(我们将调用 user1),创建另一个用户(我们将调用 user2),然后禁用 user1。因为 user1 只能在这组任务执行之前访问实例,所以这些任务位于一个特殊的 playbook 中,我们必须记住要在新实例上运行。之后,由于 user1 不再存在,所有的常用任务都由 user2 运行。

我想将 setup 和 common playbook 结合起来,这样我们就不必再手动运行 setup playbook 了。我尝试创建一个任务以查看实例上存在哪个用户,以通过尝试以 user1 身份通过 SSH 登录来使原始设置任务成为条件。问题是,如果我为任一用户尝试 SSH 登录,ansible 将退出并出现 FATAL 错误,因为它无法登录:新实例上尚不存在 user2,或者在设置 playbook 执行后 user1 已被禁用。

我相信通过 SSH 测试登录是从外部确定实例处于何种状态的唯一方法。有没有办法测试 SSH 登录而不会出现致命错误,然后根据结果有条件地执行任务?

4

2 回答 2

11

一种方法是通过 local_action 使用 shell 向 user1 调用一个简单的 ssh 命令并查看它是否成功。这些方面的东西:

- name: Test for user1
  local_action: shell ssh user1@{{ inventory_hostname }} "echo success"
  register: user1_enabled

然后你可以在另一个任务中使用这样的东西来看看它是否有效:

  when: user1_enabled.stdout.find("success") != -1
于 2013-12-12T14:41:14.430 回答
5

Ansible >= 2.5 可以使用wait_for_connection_module( https://docs.ansible.com/ansible/2.5/modules/wait_for_connection_module.html )。

- name: Wait 600 seconds for target connection to become reachable/usable
  wait_for_connection:
于 2018-09-23T21:59:00.417 回答