Ansible Playbook在运行具有sudo的远程shell脚本时冻结

时间:2018-09-14 08:21:14

标签: shell ansible

注意:这种情况是vitualbox运行一个最小的ubuntu映像,用作从ubuntu 16.04访问的远程主机

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

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

如何配置ansible剧本,以使其不会在执行shell文件中的sudo apt-get update时出现密码提示时冻结。

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

我要传递主机,用户并以--extra-vars的形式传递给剧本,

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

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

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

这是我的剧本-


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

1 个答案:

答案 0 :(得分:0)

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

根据您的评论:

  

我需要使用特定的用户帐户和密码而不是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"