如何将我的分布式 shell 脚本映射到 ansible

how to map my distributed shell script to ansible

我是 Ansible 的新手,我正在尝试 "rewrite" 我的分布式 shell 脚本到 Ansible。通常我已经将 ssh 密钥从我的一个服务器交换到一堆其他服务器(user1 用户)。并且该用户对所有这些客户端都具有 sudo 权限(可以执行 "sudo bash")。我需要 运行 作为第二个用户 (user2) 在所有这些主机上执行一些命令。所以我的脚本看起来像:

hosts="hosts.txt"

while read line;
do
    ssh user1@${line} bash << EOF
    sudo bash << EOT
    su - user2 << EOS
    /path/to/command arg1 arg2
EOS
EOT
EOF
done < ${hosts}

有什么可靠的方法可以做到这一点吗?

我发现有一个方法可以become/become_user,但这与sudo有关,而user2没有任何sudo权限。

解决方案是授予user1 sudo权限,使其能够像user2一样执行/path/to/command吗?有没有其他方法可以避免添加新的 sudo 权限?

作为概念验证,将主机放在 hosts.txt 中的 ansible inventory 中,然后使用以下剧本尝试:

---
- hosts:
    - all
  remote_user: user1

  tasks:
  - name: your task
    shell: '/path/to/command arg1 arg2'
    become: True
    become_user: user2
    register: output

  - name: DEBUG
    debug:
      var: output

应使用 ansible-playbook your_playbook.yml 执行。

如果您的 /etc/sudoers 有点难看并且这不起作用,那么您可以将任务 your task 替换为以下内容:

  - name: your task
    shell: 'sudo bash -c "su - user2 -c \"/path/to/command arg1 arg2\""'
    register: output

我认为你不应该拆分包含 sucommand 的行,而更喜欢这样的内容:

su - user2 -c '/path/to/command arg1 arg2'

如果 user2 需要其 GNU/Bash 环境,您可以将行更改为:

bash -c "su - user2 -c '/path/to/command arg1 arg2'"