注意:这种情况是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 }}"
答案 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 update
和become
与用户一起执行的其他任务(如果需要)。另外,请尽可能使用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"