在Ansible中如何使用sudo无需密码执行命令

82次阅读
没有评论

问题描述

当我在对一台具有某些需要以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将使用该文件中的密码来执行相应的任务,而无需手动输入密码。

使用commandshell模块

如果你的目标是在特定情况下以无需密码的方式执行单个命令,你可以使用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)特权,并遵循最佳安全实践。

正文完