关于实现Ansible Playbook自动根据操作系统选择执行用户的技术问询
嘿,我来帮你搞定这个跨系统适配的Ansible Playbook问题,几步就能实现自动识别OS、切换执行用户并从Vault取密码的需求:
Ansible在收集facts的时候会自动获取ansible_os_family这个值——RHEL系(CentOS、Rocky这些)的机器这个值是RedHat,Debian系(Ubuntu、Debian)是Debian,咱们就用这个来动态切换远程执行用户。
首先得把RHEL的root密码和Debian的sysadmin密码加密存起来,别明文放着。咱们在group_vars/init_clients/目录下创建两个文件:一个加密的Vault文件存密码,一个普通文件引用Vault变量(方便Playbook调用)。
先创建加密的Vault文件:
# 执行这个命令后,输入你的Vault加密密码,然后编辑文件内容 ansible-vault create group_vars/init_clients/vault.yml
在加密文件里添加这几个变量(把示例密码换成你实际的):
vault_rhel_root_password: "你的RHEL机器root密码" vault_debian_sysadmin_password: "你的Debian机器sysadmin密码" # 如果ansible-admin用户的密码哈希也想加密,也可以加在这里 vault_ansible_admin_passwd: "你的ansible-admin用户密码哈希"
然后创建一个普通的vars.yml文件,用来引用Vault里的变量(这样Playbook里不用直接写带vault前缀的变量名,更清晰):
# group_vars/init_clients/vars.yml rhel_root_password: "{{ vault_rhel_root_password }}" debian_sysadmin_password: "{{ vault_debian_sysadmin_password }}" ansible_admin_passwd: "{{ vault_ansible_admin_passwd }}"
现在把原来的Playbook改成动态适配的版本,核心就是用ansible_os_family来判断设置远程用户、连接密码和sudo密码:
- name: Initialize managed nodes hosts: init_clients gather_facts: yes ignore_errors: no # 动态选远程用户:RHEL用root,Debian用sysadmin remote_user: "{{ 'root' if ansible_os_family == 'RedHat' else 'sysadmin' }}" # 加载变量文件,包括加密的Vault文件 vars_files: - group_vars/init_clients/vars.yml - group_vars/init_clients/vault.yml vars: user: ansible-admin passwd: "{{ ansible_admin_passwd }}" # 从Vault取加密的用户密码哈希 # 统一开启sudo提权:Debian的sysadmin需要提权到root,RHEL的root本身就是管理员 become: yes become_user: root # 动态设置sudo密码:RHEL的root不需要,Debian用sysadmin的密码 become_password: "{{ '' if ansible_os_family == 'RedHat' else debian_sysadmin_password }}" roles: - create_admin_user - set_authorized_key - set_no_pass
注意:你原来的Playbook里写的user: root是错误的,正确的关键字是remote_user,上面的版本已经修正了这个问题。
你的三个角色要确保没有硬编码用户,比如set_no_pass角色里配置sudoers的任务,要用到{{ user }}变量,比如:
# set_no_pass/tasks/main.yml - name: Allow {{ user }} to run sudo without password lineinfile: path: /etc/sudoers.d/ansible-admin line: "{{ user }} ALL=(ALL) NOPASSWD: ALL" state: present mode: 0440 validate: 'visudo -cf %s'
这样不管哪个系统,都会给你指定的ansible-admin用户配置免密码sudo。
运行的时候要带上Vault密码,要么交互式输入:
ansible-playbook -i 你的inventory文件 init_node.yml --ask-vault-pass
要么用密码文件(更适合自动化场景):
ansible-playbook -i 你的inventory文件 init_node.yml --vault-password-file=./vault_pass.txt
这样你的Playbook就能自动识别目标主机的OS,自动用对应的用户执行,密码也都是从加密的Vault里取的,完全符合你的需求~
内容的提问来源于stack exchange,提问作者nf9

