是否可以根据现有事实设置 Ansible Vars?

时间:2021-01-27 19:23:40

标签: variables ansible sshpass

我发现很容易描述我想要做什么,展示我如何尝试实现它,如下所示。

在一个 playbook1.yml 中,我有:

- name: set facts with ssh connecton details
  set_fact:
    ssh_user: "user01"
    ssh_pass: "passw0rd"

在我的 playbook2.yml 中,我想做类似的事情:

import_playbook: playbook1.yml
Vars:
  ansible_user: "{{ ssh_user }}"
  ansible_ssh_pass: "{{ ssh_pass }}"

在此之后,我在 playbook2.yml 中的任务在连接到我的远程主机时应该尝试使用 sshpass,获取用户并通过上面的“ansible_*”Vars。

能做到吗?显然这是行不通的,我无法找到解决方案。

为 ssh 变量设置 Ansible 事实确实有效 - 显然它需要变量来触发 sshpass 并使用密码进行远程访问。

我知道 ssh 密钥是可行的方法,并且正在涵盖,但是我还需要针对此特定用例的解决方案。

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

目前我找到的唯一解决方案是:

剧本1: 设置事实,并保存到文件

在 playbook2 上:

Vars:
  ansible_user: "{{lookup(file',('userfactsfile')}}"
  ansible_ssh_pass: "{{lookup(file',('passfactsfile')}}"

Tasks:
- import_playbook: playbook1.yml

...
my actions here
...
delete userfactsfile
delete passfactsfile

还有一个问题:密码在剧本运行期间以明文形式保存。如果过程中出现意外中断,密码文件可能会保留在服务器中(这是同一工作中要解决的主要问题)。

可接受的解决方案是: 在将密码保存到 paybook1 文件之前加密密码,但是,我遇到了一些技术挑战(我在 Ansible 中非常菜鸟),但如果我能实现,仍然是一个可行的解决方案。 playbook1 中的加密将使用实际密码作为密码。事实上,密码在两个剧本中都是持久的。 在 playbook2 中,此密码将用于在 Vars 查找中解密密码文件。