
Ansible Playbook创建用户并配置 sudo 权限最近学习 Ansible Playbook看到项目中一段用于配置部署用户的 Playbook记录一下其中几个比较重要的知识点。- name: Configure deployer user and sudo accesshosts: k8sbecome: truegather_facts: notasks:- name: Ensure deployer group existsgroup:{{ sealer_user }}name: {{ sealer_user }}state: present- name: Create deployer user and set passworduser:name: {{ sealer_user }}group: {{ sealer_user }}shell: /bin/bashpassword: {{ sealer_user_password | password_hash(sha512) }}update_password: on_createstate: present- name: Create and configure sudoers.d nopasswd filecopy:content: |{{ sealer_user }} ALL(ALL) NOPASSWD: ALL核心内容dest: /etc/sudoers.d/{{ sealer_user }}owner: rootgroup: rootmode: 0440Owner读、Group读、Other无权限validate: /usr/sbin/visudo -cf %s一、Playbook 做了什么整体很简单创建用户组↓创建用户↓设置密码↓配置 sudo 免密hosts: k8s表示对 Inventory 中k8s主机组执行。become: true表示执行任务时提升权限通常就是使用 root 权限。二、Jinja2 变量Playbook 中经常看到{{ sealer_user }}这是 Jinja2 变量。例如外部定义sealer_user: deployer那么name: {{ sealer_user }}实际执行时就是name: deployer变量不一定定义在当前 Playbook 中也可能来自inventorygroup_varshost_varsrole-e所以看到{{ xxx }}时需要去项目中搜索xxx的定义。三、Jinja2 Filter{{ sealer_user_password | password_hash(sha512) }}这里的|表示使用 Filter 对变量进行处理。sealer_user_password↓password_hash↓SHA-512 密码哈希常见形式{{ variable | filter }}四、sudoers 配置最终{{ sealer_user }} ALL(ALL) NOPASSWD: ALL假设用户是deployer最终就是deployer ALL(ALL) NOPASSWD: ALL表示deployer 用户可以免密码执行任意 sudo 命令。配置文件放在/etc/sudoers.d/deployer/etc/sudoers.d/是 Linux 中用于存放额外 sudo 权限配置的目录。五、validate比较值得注意的是validate: /usr/sbin/visudo -cf %svisudo用于检查 sudoers 配置语法。%s是 Ansible 的占位符执行时会替换成 Ansible 准备好的临时文件。因此整个过程相当于生成新配置↓visudo 检查↓检查通过 → 正式写入检查失败 → 不修改原文件这样可以避免错误的 sudoers 配置直接覆盖生产环境中的正确配置。