Ansible 命令行从保险库中检索 ssh 密码

Ansible 命令行从保险库中检索 ssh 密码

我正在尝试设置 Ansible 来管理来自不同客户的 Linux 机箱,以下是我们必须处理的内容。

  1. 没有公钥认证——我和你一样想要它,但它不会很快发生。
  2. 我们以 root 身份登录,每个客户在所有 Linux 机器上都有不同的 root 密码。我们正在努力禁用直接 root 登录并通过 root 进行所有操作,sudo但同样,这需要一些时间。

我设法为每个客户创建一个 ansible 保险库文件,其中包含ansible_ssh_useransible_ssh_pass按照剧本运行良好。

---
- hosts:
    - SERV01
    - SERV02
  vars_files:
    - roles/common/vault/main.yml

  tasks:
    - name: enable and start ntpd
      service: name=ntpd enabled=yes state=running

现在我想知道如何从命令行使用 Vault 文件,但以下方法均不起作用。

ansible customer1 -m shell -a "var_files:roles/common/vault/main.yml uptime" --ask-vault-pass

ansible customer1 -m shell -a "uptime" -e "vars_files:roles/common/vault/main.yml"  --ask-vault-pass

我究竟做错了什么 ?

谢谢

答案1

最后我终于找到了方法:

ansible customer1 -e @group_vars/vault/customer1.yml --ask-vault-pass -m shell -a uptime

现在我可以将ansible_ssh_useransible_ssh_pass放入ansible_sudo_pass保险库文件中,我只需要记住保险库密码。

我希望这也能让您更加享受 Ansible。

谢谢

答案2

尽管 OP 自己回答了这个问题,但我想分享我自己的答案。我发现 OP 的回答有几点不太清楚:

OP 使用的解决方案称为“group_vars”。要使用“group_vars”,您需要有一个“group_vars”目录,其中存放着您的 inventory.ini 文件。在目录中为每个组名(inventory.ini 中显示的对象[groupname])创建一个 .yaml 文件。因此,如果您的 inventory.ini 中有以下内容

[g1]
10.10.10.10
[g2]
10.10.11.10

如果您想在使用 group_vars 时为每个组创建单独的 ssh 会话,则需要创建以下文件:

./group_vars/g1.yaml
./group_vars/g2.yaml

在这些文件中,您可以输入变量,实际上是任何变量。但在本帖的问题背景下,您可以执行以下操作:

./group_vars/g1.yaml

ansible_ssh_user: "user1"
ansible_ssh_pass: "MyP4ss"
ansible_become_pass: "MyP4ss"

./group_vars/g2.yaml

ansible_ssh_user: "user2"
ansible_ssh_pass: "MyP4ssNew"
ansible_become_pass: "MyP4ssNew"

现在你可以运行你的 ansible playbook 而不需要传递额外的变量参数:

$ ansible-playbook -i ./inventory.ini myplaybook.yaml --ask-vault-pass

顺便说一句,您可以以相同的方式使用 ansible vault。为每个密码创建一个 vault 加密:

ansible-vault encrypt_string 'MyP4ss' --name 'ansible_ssh_pass'
ansible-vault encrypt_string 'MyP4ssNew' --name 'ansible_ssh_pass'

你会看到类似这样的内容:

ansible_ssh_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66636431343633646639343661353330326634336565653430326662303039643634303564316132
          313736323431653749839238373332303861353734393430340a3131336662316161633137343235363465303461613534373439333336306130316531363836323137376632
          6335303031343732300a34363636646334613162643863386435303833373735383830343234626480859048029850329
          3539

ansible_ssh_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          9387295873723633646639343661353330326634336565653430326662303039643634303564316132
          313736323431653749839238373332303861353734393430340a3131336662316161633137343235363465303461613534373439333336306130316531363836323137376632
          6335303031343732300a34363636646334613162643863386435303833373735383830343234626480859048029850329
          4738

请注意,运行这些命令时,它会要求您每次更改 ansible vault 密码。它不会删除旧密码。如果您想保留上次使用的密码,只需输入相同的 ansible vault 密码即可。此外,“ansible_ssh_pass”只是一个参考名称,只要密码相同,您可以将其更改为任何您想要的名称。请注意下面我如何复制和粘贴它并每次更改参考名称。

现在只需从终端复制并粘贴到每个 group_var 文件中的密码变量中:

./group_vars/g1.yaml

ansible_ssh_user: user1
ansible_ssh_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66636431343633646639343661353330326634336565653430326662303039643634303564316132
          313736323431653749839238373332303861353734393430340a3131336662316161633137343235363465303461613534373439333336306130316531363836323137376632
          6335303031343732300a34363636646334613162643863386435303833373735383830343234626480859048029850329
          3539
ansible_become_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66636431343633646639343661353330326634336565653430326662303039643634303564316132
          313736323431653749839238373332303861353734393430340a3131336662316161633137343235363465303461613534373439333336306130316531363836323137376632
          6335303031343732300a34363636646334613162643863386435303833373735383830343234626480859048029850329
          3539

./group_vars/g1.yaml

ansible_ssh_user: user2
ansible_ssh_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          9387295873723633646639343661353330326634336565653430326662303039643634303564316132
          313736323431653749839238373332303861353734393430340a3131336662316161633137343235363465303461613534373439333336306130316531363836323137376632
          6335303031343732300a34363636646334613162643863386435303833373735383830343234626480859048029850329
          4738
ansible_become_pass: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          9387295873723633646639343661353330326634336565653430326662303039643634303564316132
          313736323431653749839238373332303861353734393430340a3131336662316161633137343235363465303461613534373439333336306130316531363836323137376632
          6335303031343732300a34363636646334613162643863386435303833373735383830343234626480859048029850329
          4738

现在,您可以根据您的库存文件,以有组织的方式,使用不同的 ssh 登录凭证连接到多个主机。

这里还有关于使用 ansible group_vars 的文档: https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html

答案3

我不确定 Ansible 是否可以做到这一点。如果不能,一种方法是

ansible customer1 -e "`ansible-vault view roles/common/vault/main.yml | grep ansible_ssh_pass`" -m shell -a uptime

相关内容