首页 > 解决方案 > Ansible Playbook 在运行具有 sudo 的远程 shell 脚本时冻结

问题描述

注意:这是使用 vitualbox 运行最小 ubuntu 映像的场景,该映像用作从 ubuntu 16.04 访问的远程主机

我是一个初学者,使用 ansible 在远程服务器上运行 shell 脚本,但它似乎冻结了,即使在参数中使用“-vvv”后我也没有收到任何日志。经过一些调试后,我发现问题出sudo apt-get update在 shell 脚本中。

如果我将密码作为参数从 ansible plabook 传递给 shell 文件,然后将其用作echo "$PASS" | sudo -S apt-get update,则脚本似乎可以工作。

如何配置我的 ansible Playbook,使其sudo apt-get update在 shell 文件中执行时不会在密码提示符下冻结。

我需要使用特定的用户帐户和密码而不是 root。

我将主机、用户和 --extra-vars 传递给剧本,

{{ host }} 是远程主机的 IP 地址。

{{ user }} 是远程计算机上的用户帐户。

{{ pass }} 是远程机器上用户帐户的密码。

这是我的ansible剧本-

---
- 主机:“{{主机}}”
  远程用户:“{{用户}}”
  变量:
    ansible_become_pass:“{{通过}}”
  任务:
    - 名称:将 test.sh 文件移动到远程
      复制:
        源代码:./../scripts/test.sh
        目标:/home/{{ 用户 }}/new/test.sh

    - 名称:执行 test.sh 脚本
      命令:sh test.sh
      参数:
        chdir: /home/{{ 用户 }}/new/
      变成:是
      成为用户:“{{用户}}”

标签: shellansible

解决方案


我可以在这里看到两件事:

根据您的评论:

我需要使用特定的用户帐户和密码而不是 root。

在 Ubuntu 中,apt-get update 必须以 ID 0(root)身份运行,不是吗?所以当你添加:

become: yes

意味着您希望您的用户能够执行您需要的操作。

在这种情况下apt-get update,需要 root 访问权限才能锁定/var/lib/apt/lists/

我想这不是你的情况,所以你需要这样做:

---
- hosts: "{{ host }}"
  remote_user: "{{ user }}"
  vars:
    ansible_become_pass: "{{ pass }}"
  tasks:
    - name: Move test.sh file to remote
      copy: 
        src: ./../scripts/test.sh
        dest: /home/{{ user }}/new/test.sh

    - name: Executing the test.sh script
      command: sh test.sh
      args:
        chdir: /home/{{ user }}/new/
      become: yes

删除become_user: "{{ user }}". 我想用户也有 sudo 访问权限来运行apt-get update,所以密码可以工作。

另一方面,您不需要sudp apt-get update在脚本中运行,一个简单的apt-get update就足够了。

这里是第一件事。

其次,我建议您拆分操作。如果您要更新系统,请先执行以下操作:

apt-get updatebecome

以及与用户一起完成的其他任务(如果需要)。另外,尽可能使用 ansible 模块。apt-get update当你有以下情况时不要跑步:

- name: apt-get example
  apt:
    name: package
    update_cache: yes

甚至package

顺便说一句,我将示例运行为:

ansible-playbook test.yml -e "host=ubuntu-1.vagrant.local pass=ansible user=ansible"

推荐阅读