在Ansible自动化运维中,普通用户通过su命令切换root权限是常见的需求场景。本文将深入分析su切换问题的根源,并提供多种可行的解决方案。
1. 终端限制:Ansible默认通过非交互式会话执行命令,而su需要真实的终端环境
2. PAM配置限制:系统PAM模块可能禁止非终端su操作
3. 密码策略冲突:密码包含特殊字符或长度不符合要求
4. SELinux限制:安全策略可能阻止su操作
- hosts: all
become: yes
become_method: sudo
tasks:
- name: 以root执行命令
command: whoami
# 生成密钥对
ssh-keygen -t rsa
# 拷贝公钥到目标机
ssh-copy-id user@target
# 编辑/etc/pam.d/su
# 注释掉包含"pam_securetty.so"的行
- name: 使用expect处理su
expect:
command: su - root
responses:
'Password:': "{{ su_password }}"
[defaults]
interpreter_python = /usr/bin/python
host_key_checking = False
[privilege_escalation]
become=True
become_method=su
become_user=root
become_ask_pass=True
Q:如何避免在playbook中明文存储密码?
A:使用ansible-vault加密变量文件:ansible-vault encrypt vars.yml
Q:sudo和su哪种方式更推荐?
A:sudo更安全,因为它可以细化控制每个命令的权限,且有完整的日志记录。
Q:出现"Sorry, you must have a tty to run sudo"错误怎么办?
A:在目标机的/etc/sudoers中添加:Defaults:ansible_user !requiretty