shell - 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/ 变成:是 成为用户:“{{用户}}”
解决方案
我可以在这里看到两件事:
根据您的评论:
我需要使用特定的用户帐户和密码而不是 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"
推荐阅读
- jenkins - 如何在詹金斯管道中获取工作所有者的姓名?
- javascript - 您能否取悦 express.urlencoded 中使用的选项(扩展:false)?
- sql-server - 动态数据屏蔽如何在 SQL Server 中工作?
- reactjs - 如何让 webshim polyfill 库在 React 中工作?
- laravel - 为什么我的 view-policy 有效,但 viewAny-policy 无效?
- java - DecimalFormatted String 的奇怪行为
- android - RecyclerView ItemDecoration - 如何为每个 viewHolder 绘制不同的宽度分隔线?
- spring-security - 如何在spring + java中添加(覆盖)oAuth2访问令牌的到期时间
- angular - 在ngrx / entity angular 7中addOne和upsertOne之间的区别
- c# - ImageStream 的进度条不显示从 0 到 1 的值