问题描述
当我在对一台具有某些需要以root身份运行的命令的主机机器上运行ansible时,我不能使用”become”来运行这些命令,因为它会将命令作为root而不仅仅是使用sudo来运行它们。
我一直在使用command: sudo ...
,然后通过args: warn: no
来抑制警告。
有没有更好、更标准的方法来以无需密码的方式运行Linux命令行?
解决方案
请注意以下操作可能存在版本差异及风险,请提前做好备份。
使用Ansible的become
和密码参数
在Ansible中,使用become
(或sudo
)来以root权限执行任务是很常见的做法。如果你希望在执行任务时无需手动输入密码,可以使用Ansible提供的-K
参数来输入sudo密码。这将使Ansible在需要时自动提供密码,从而允许你以无需密码的方式运行命令。
以下是如何在Ansible命令中使用-K
参数的示例:
ansible-playbook -i inventory.ini playbook.yml -K
在上面的示例中,-K
参数会提示你输入sudo密码,然后Ansible会在需要时自动使用该密码执行相关的任务。
使用Ansible的become
和密码文件
如果你不想在命令行中直接输入sudo密码,你可以使用密码文件来提供密码。首先,将sudo密码保存到一个文件中,然后在Ansible的任务中指定该文件路径。这样,你就可以在执行任务时通过密码文件来提供sudo密码,实现无需手动输入密码。
以下是如何在Ansible中使用密码文件的示例:
1. 创建一个名为password_file
的文本文件,将sudo密码保存在该文件中。
2. 在你的Ansible playbook 中,将密码文件路径指定为become_pass
选项的值:
---
- name: Run tasks as root
hosts: your_hosts
become: yes
become_method: sudo
become_pass: /path/to/password_file
tasks:
- name: Your task here
# 定义任务的其他配置
在上面的示例中,become_pass
选项将sudo密码文件的路径指定为/path/to/password_file
。Ansible将使用该文件中的密码来执行相应的任务,而无需手动输入密码。
使用command
或shell
模块
如果你的目标是在特定情况下以无需密码的方式执行单个命令,你可以使用Ansible的command
模块或shell
模块。这些模块可以让你在执行任务时指定具体的命令,并且可以通过become
选项来以root权限执行命令,无需手动输入密码。
以下是使用command
模块的示例:
---
- name: Run command without password
hosts: your_hosts
tasks:
- name: Run command
command: your_command_here
become: yes
在上面的示例中,通过将become
选项设置为yes
,任务将以root权限执行命令,而无需手动输入密码。
请注意,尽管上述方法可以在特定情况下实现无需密码的方式运行命令,但为了安全起见,仍然建议在生产环境中限制使用become
(sudo)特权,并遵循最佳安全实践。