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

时间:2018-10-23 06:10:19

标签: bash ansible sudo

我是Ansible的新手,我试图将我的分布式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_user,但这与sudo有关,并且user2没有任何sudo权限。

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

2 个答案:

答案 0 :(得分:0)

仅作为概念证明,将主机放入https://www.ibm.com/developerworks/data/library/techarticle/dm-1401sqltrace/index.html中的hosts.txt中,并在以下剧本中进行尝试:

---
- 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

答案 1 :(得分:0)

我认为您不应该拆分包含 su command 的行,而应该选择类似以下内容的

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

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

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