22、Ansible用户管理与SSH密钥、加密密码设置全攻略

Ansible用户管理与SSH密钥、加密密码设置全攻略

1. 生成sudoers模板文件

首先,我们要创建一个Jinja2模板文件 exercise131.j2 ,其内容如下:

{{ item.groups }} ALL=(ALL:ALL) NOPASSWD:ALL

接着,在playbook中添加生成模板文件的任务:

- name: allow group members in sudo
  template:
    src: exercise131.j2
    dest: /etc/sudoers.d/sudogroups
    validate: ‘visudo -cf %s’
    mode: 0440
  loop: "{{ users }}"

最后,使用 ansible-playbook exercise131.yaml 命令来验证playbook是否按预期工作。

2. 管理SSH连接

在创建用户时,通常需要设置SSH密钥。下面我们来了解一下SSH密钥在用户与SSH服务器通信过程中的使用流程:
1. 用户发起与SSH服务器的会话。
2. 服务器将用其私钥加密的标识令牌发送给用户。
3. 用户使用存储在 ~/.ssh/known_hosts 文件中的服务器公钥指纹来验证标识令牌。
4. 若 ~/.ssh/known_hosts 文件中尚未存储公钥指纹,用户会被提示将远程服务器标识存储在该文件中,此时无法很好地验证是否与预期服务器通信。
5. 确认远程服务器身份后,用户可以发送密码或基于其私钥生成的认证令牌。
6. 若发送的是基于用户私钥的认证令牌,服务器会尝试将其与存储在 ~/.ssh/authorized_keys 文件中的用户公钥进行匹配。
7. 若传入的认证令牌与 authorized_keys 文件中存储的用户公钥匹配,用户将通过认证;若认证失败且允许密码认证,则会尝试进行密码认证。

在这个认证过程中,有两对密钥起着重要作用:
| 密钥对 | 作用 | 管理模块 |
| ---- | ---- | ---- |
| 服务器公/私钥对 | 用于建立安全连接 | Ansible known_hosts模块 |
| 用户公/私钥对 | 用户用于认证 | Ansible authorized_key模块 |

3. 使用查找插件

查找插件在处理SSH公钥时非常重要,它能让Ansible从外部源访问数据,比如读取文件系统或联系外部数据存储和服务。以下是一个使用查找插件将变量值设置为文件内容的简单示例:

---
- name: simple demo with the lookup plugin
  hosts: localhost
  vars:
    file_contents: "{{lookup(‘file’, ‘/etc/hosts’)}}"
  tasks:
  - debug:
                var: file_contents
4. 设置SSH用户密钥

若要使用控制主机的用户账户通过SSH连接到托管主机上的用户账户,可以将本地用户公钥复制到远程用户的 ~/.ssh/authorized_keys 文件中。如果目标 authorized_keys 文件只需包含一个密钥,可以使用 copy 模块;若要管理多个密钥,则建议使用 authorized_key 模块。以下是使用 authorized_key 模块复制用户 ansible 的授权密钥的示例:

---
- name: authorized_key simple demo
  hosts: ansible2
  tasks:
  - name: copy authorized key for ansible user
    authorized_key:
      user: ansible
      state: present
      key: "{{ lookup(‘file’, 
‘/home/ansible/.ssh/id_rsa.pub’) }}"

若要为多个用户执行相同操作,可以参考以下示例:

---
- name: configure users with SSH keys
  hosts: ansible2
  vars_files:
    - vars/users
    - vars/groups
  tasks:
  - name: add groups
    group:
      name: "{{ item.groupname }}"
    loop: "{{ usergroups }}"
  - name: add users
    user:
      name: "{{ item.username }}"
      groups: "{{ item.groups }}"
    loop: "{{ users }}"
  - name: add SSH public keys
    authorized_key:
      user: "{{ item.username }}"
      key: "{{ lookup(‘file’, ‘files/’+ item.username + 
‘/id_rsa.pub’) }}"
    loop: "{{ users }}"

由于 authorized_keys 模块无法直接从隐藏目录读取文件,我们需要进行一些处理。以下是一个完整的示例,展示了如何创建本地用户并设置SSH密钥:

- name: create the local user, including SSH key
  user:
    name: "{{ username }}"
    generate_ssh_key: true
    ssh_key_comment: "{{ username }}@{{ ansible_fqdn }}"

- name: create a directory to store the file
  file:
    name: "{{ username }}"
    state: directory

- name: copy the local user ssh key to temporary {{ 
username }} key
  shell: ‘cat /home/{{ username }}/.ssh/id_rsa.pub > {{ 
username }}/id_rsa.pub’

- name: verify that file exists
  command: ls -l {{ username }}/
5. 管理加密密码

在Ansible中管理用户时,通常需要设置用户密码。但 user 模块期望输入的是加密字符串,而不是明文密码。

5.1 理解加密密码

用户创建的密码会被加密,加密后的密码哈希存储在 /etc/shadow 文件中,该文件有严格的安全保护,只有root权限才能访问。加密字符串由三部分组成,用 $ 符号分隔:
- 所使用的哈希算法
- 用于加密密码的随机盐
- 用户密码的加密哈希

5.2 生成加密密码

在使用Ansible的 user 模块创建用户时, password 选项需要输入加密密码字符串。可以使用以下临时命令生成加密字符串:

ansible localhost -m debug -a "msg={{ ‘password’ | 
password_hash(‘sha512’,’myrandomsalt’) }}"

生成的加密字符串示例如下:

$6$myrandomsalt$McEB.xAVUWe0./6XqZ8n/7k9VV/Gxndy9nIMLyQAi
PnhyBoToMWbxX2vA4f.Uv9PKnPRaYUUc76AjLWVAX6U10

以下是一个使用加密密码创建用户的playbook示例:

---
- name: create user with encrypted pass
  hosts: ansible2.example.com
  vars:
    password: 
"$6$myrandomsalt$McEB.xAVUWe0./6XqZ8n/7k9VV/Gxndy9nIMLyQAi
PnhyBoToMWbxX2vA4f.Uv9PKnPRaYUUc76AjLWVAX6U10"
  tasks:
  - name: create the user
    user:
      name: anna
      password: "{{ password }}"
5.3 替代方法

除了上述方法,还可以使用Linux命令 echo password | passwd --stdin 来设置用户密码。以下是示例:

---
- name: create user with encrypted password
  hosts: ansible3
  vars:
    password: mypassword
    user: anna
  tasks:
  - name: configure user {{ user }}
    user:
      name: "{{ user }}"
      groups: wheel
      append: yes
      state: present
  - name: set a password for {{ user }}
    shell: ‘echo {{ password }} | passwd --stdin {{ user 
}}’
6. 创建带加密密码的用户

以下是创建带加密密码用户的详细步骤:
1. 使用编辑器创建文件 exercise133.yaml
2. 编写playbook的头部:

---
- name: create user with encrypted password
  hosts: ansible3
  vars_prompt:
  - name: passw
    prompt: which password do you want to 
use
  vars:
    user: sharon
  tasks:
  1. 添加第一个任务,使用 debug 模块生成加密密码字符串,并使用 register 将字符串存储在变量 mypass 中:
- debug:
    msg: "{{ ‘{{ passw }}’| password_hash(
‘sha512’,’myrandomsalt’) }}"
  register: mypass
  1. 添加 debug 模块分析注册变量的准确格式:
- debug:
    var: mypass
  1. 首次运行 ansible-playbook exercise133.yaml ,查看需要使用的变量的确切名称。
  2. 根据上一步的输出,使用 user 模块正确引用密码:
- name: create the user
  user:
    name: "{{ user }}"
    password: "{{ mypass.msg }}"
  1. 再次运行 ansible-playbook exercise133.yaml 并验证输出。
7. 高级场景练习:设置Ansible用户

这个练习将指导我们创建几个Ansible用户,要求用户在Ansible控制主机和托管主机上都被创建,并且本地创建的用户能够使用SSH密钥无密码登录到远程主机上对应的用户账户。具体要求如下:
- 创建用户 sharon blair ashley ahmed
- 用户 sharon blair 属于 admins 组;用户 ashley ahmed 属于 students 组。
- 在托管主机上, admins 组成员应具有 sudo 权限,可以运行任何命令。
- 所有用户都配置默认密码“password”。

以下是详细步骤:
1. 搭建playbook框架
使用编辑器创建 exercise134.yaml 文件,并定义playbook的头部和每个任务的名称及模块:

---
- name: create users on localhost
  hosts: localhost
  tasks:
  - name: create groups
    groups:
  - name: create users
    users:
- name: create users on managed hosts
  hosts: ansible4
  tasks:
  - name: create groups
    groups:
  - name: create users
    users:
  - name: copy authorized keys
    authorized_key:
  - name: modify sudo configuration
    template
  1. 填充详细内容
    从第一个play开始,创建用户账户。这里需要创建用户和组:
---
- name: create users on localhost
  hosts: localhost
  vars:
    users:
    - username: sharon
      groups: admins
    - username: blair
      groups: admins
    - username: ashley
      groups: students
    - username: ahmed
      groups: students
  tasks:
  - name: create groups
    groups:
      name: "{{ item.groups }}"
      state: present
    loop: "{{ users }}"
  - name: create users
    user:
      name: "{{ item.username }}"
      groups: "{{ item.groups }}"
    loop: "{{ users }}"
  1. 初步验证
    暂时注释掉整个第二个play,使用 ansible-playbook -C exercise134.yaml 命令在检查模式下运行playbook。若出现错误,修正后再次运行。
  2. 完成第一个play
    在第一个play中添加设置用户密码和创建SSH密钥对的任务。使用以下命令生成加密密码字符串:
ansible localhost -m debug -a “msg={{ ‘password’ |
password_hash(‘sha512’, ‘mysalt’) }}”

将生成的加密字符串复制到以下任务中:

- name: create users
    user:
      name: "{{ item.username }}"
      groups: "{{ item.groups }}"
      generate_ssh_key: yes
      password: $6$mysalt$khiuhihrb8y349hw
bohbuoehr8bhqohoibhro8bohoiheoi
    loop: "{{ users }}"
  tags: setuplocal

可以使用 ansible-playbook exercise134.yaml --tags=setuplocal 命令运行这个部分。
5. 处理第二个play
由于第二个play中的一些任务与第一个play重复,为了提高效率,我们可以创建导入文件。
创建 exercise134-vars.yaml 文件,内容如下:

---
    users:
    - username: sharon
      groups: admins
    - username: blair
      groups: admins
    - username: ashley
      groups: students
    - username: ahmed
      groups: students

创建 exercise134-tasks.yaml 文件,内容如下:

- name: create groups
    group:
      name: "{{ item.groups }}"
      state: present
    loop: "{{ users }}"
- name: create users
    user:
      name: "{{ item.username }}"
      groups: "{{ item.groups }}"
      generate_ssh_key: yes
      ssh_key_comment: "{{ item.username }}@{{ ansible_fqdn }}"
      password: $6$mysalt$khiuhihrb8y349hw
bohbuoehr8bhqohoibhro8bohoiheoi
    loop: "{{ users }}"

重写playbook:

---
- name: create users on localhost
  hosts: localhost
  vars_files:
  - exercise134-vars.yaml
  tasks:
  - name: include user and group setup
    import_tasks: exercise134-tasks.yaml
  tags: setuplocal
- name: create users on managed hosts
  hosts: ansible4
  vars_files:
  - exercise134-vars.yaml
  tasks:
  - name: include user and group setup
    import_tasks: exercise134-tasks.yaml
  - name: copy authorized keys
    authorized_key:
  - name: modify sudo configuration
  1. 完成复制授权密钥任务
- name: create users on managed hosts
  hosts: ansible4
  vars_files:
  - exercise134-vars.yaml
  tasks:
  - name: include user and group setup
    import_tasks: exercise134-tasks.yaml
  - name: copy authorized keys
    authorized_key:
      user: "{{ item.username }}"
      key: "{{ lookup(‘file’, ‘/home/’+ item.username + 
‘/.ssh/id_rsa.pub’) }}"
    loop: "{{ users }}"
#  - name: modify sudo configuration
  tags: setupremote

运行 ansible-playbook exercise134.yaml --tags=setupremote 时可能会出现错误,因为 authorized_keys 模块无法直接从隐藏的 .ssh 目录访问 id_rsa.pub 文件。
7. 修复错误
重写第一个play,添加复制用户SSH公钥的任务:

---
- name: create users on localhost
  hosts: localhost
  vars_files:
  - exercise134-vars.yaml
  tasks:
  - name: include user and group setup
    import_tasks: exercise134-tasks.yaml
  - name: create a directory to store the 
key file
    file:
      name: "{{ item.username }}"
      state: directory
    loop: "{{ users }}"
  - name: copy the local user ssh key to t
emporary {{ item.username }} key
    shell: ‘cat /home/{{ item.username }}/
.ssh/id_rsa.pub > {{ item.username }}/id_r
sa.pub’
    loop: "{{ users }}"
  - name: verify that file exists
    command: ls -l {{ item.username }}/
    loop: "{{ users }}"
  tags: setuplocal
  1. 配置sudo文件
    使用 copy 模块配置 /etc/sudoers.d/ 目录下的sudo文件:
- name: copy sudoers file
  copy:
    content: ‘%admins ALL=(ALL:ALL) NOPASS
WD:ALL’
    dest: /etc/sudoers.d/admins
  1. 验证并运行playbook
    在运行playbook之前,可以参考GitHub仓库中的示例进行验证。最后,运行 ansible-playbook exercise134.yaml 完成用户设置。

通过以上步骤,我们详细介绍了Ansible中用户管理、SSH密钥设置和加密密码管理的方法,以及一个高级场景练习,希望能帮助你更好地掌握Ansible的使用。

Ansible用户管理与SSH密钥、加密密码设置全攻略

8. 总结与回顾

在前面的内容中,我们详细探讨了Ansible在用户管理、SSH密钥设置以及加密密码管理等方面的操作。下面通过一个表格来回顾一下关键知识点:
| 操作内容 | 主要模块/方法 | 关键要点 |
| ---- | ---- | ---- |
| 生成sudoers模板文件 | template 模块 | 创建Jinja2模板,使用 ansible-playbook 验证 |
| 管理SSH连接 | known_hosts authorized_key 模块 | 理解SSH认证流程,使用查找插件处理公钥 |
| 设置SSH用户密钥 | authorized_key 模块 | 处理多密钥使用 authorized_key ,解决隐藏目录访问问题 |
| 管理加密密码 | password_hash 过滤器 | 生成加密密码,使用外部工具或命令 |
| 高级场景练习 | 多个模块组合 | 创建用户、组,配置SSH密钥和sudo权限 |

9. 流程梳理

为了更清晰地展示整个设置过程,我们可以使用mermaid格式的流程图来表示:

graph LR
    A[开始] --> B[生成sudoers模板文件]
    B --> C[管理SSH连接]
    C --> D[设置SSH用户密钥]
    D --> E[管理加密密码]
    E --> F[高级场景练习]
    F --> G[完成设置]

这个流程图展示了从开始到完成设置的主要步骤,各个步骤之间相互关联,逐步完成Ansible的用户管理和相关配置。

10. 注意事项与技巧

在实际操作过程中,有一些注意事项和技巧可以帮助我们更顺利地完成任务:
- 查找插件使用 :查找插件虽然强大,但在使用时要确保文件路径正确,特别是在处理隐藏目录时容易出现问题。可以使用 -vvvvv 参数查看详细的查找路径。
- 加密密码管理 :加密密码应妥善存储,建议使用Ansible Vault进行加密,避免明文显示在playbook中。
- playbook调试 :在编写和运行playbook时,使用检查模式( -C )和标签( --tags )可以帮助我们快速定位问题和执行特定部分的任务。

11. 常见问题解答

在使用Ansible进行用户管理和相关配置时,可能会遇到一些常见问题,下面为大家解答:
- 问题1: authorized_keys 模块无法找到文件怎么办?
- 解答 :这通常是因为文件路径问题,特别是在访问隐藏目录时。可以将文件复制到可访问的目录,如示例中创建临时目录并复制公钥。
- 问题2:加密密码生成失败怎么办?
- 解答 :检查命令是否正确,特别是哈希算法和随机盐的使用。可以使用 ansible-playbook 的调试功能查看详细输出。
- 问题3:playbook运行报错如何处理?
- 解答 :首先查看错误信息,确定错误发生的位置和原因。可以使用检查模式( -C )和详细输出模式( -vvvv )来帮助定位问题。

12. 实战案例分析

为了更好地理解和应用上述知识,我们来看一个实战案例。假设我们需要为一个新的项目环境创建用户,并配置SSH密钥和sudo权限。
- 需求分析
- 创建用户 project_user1 project_user2
- 用户 project_user1 属于 project_admins 组,用户 project_user2 属于 project_students 组。
- project_admins 组成员具有sudo权限。
- 所有用户使用SSH密钥进行无密码登录。
- 解决方案
- 创建playbook

---
- name: create users on localhost
  hosts: localhost
  vars:
    users:
    - username: project_user1
      groups: project_admins
    - username: project_user2
      groups: project_students
  tasks:
  - name: create groups
    group:
      name: "{{ item.groups }}"
      state: present
    loop: "{{ users }}"
  - name: create users
    user:
      name: "{{ item.username }}"
      groups: "{{ item.groups }}"
      generate_ssh_key: yes
      ssh_key_comment: "{{ item.username }}@{{ ansible_fqdn }}"
      password: $6$project_salt$encrypted_password_here
    loop: "{{ users }}"
  - name: create a directory to store the key file
    file:
      name: "{{ item.username }}"
      state: directory
    loop: "{{ users }}"
  - name: copy the local user ssh key to temporary {{ item.username }} key
    shell: ‘cat /home/{{ item.username }}/.ssh/id_rsa.pub > {{ item.username }}/id_rsa.pub’
    loop: "{{ users }}"
  - name: verify that file exists
    command: ls -l {{ item.username }}/
    loop: "{{ users }}"

- name: create users on managed hosts
  hosts: project_host
  vars_files:
  - vars/users
  tasks:
  - name: include user and group setup
    import_tasks: exercise134-tasks.yaml
  - name: copy authorized keys
    authorized_key:
      user: "{{ item.username }}"
      key: "{{ lookup(‘file’, ‘./’+ item.username +’/id_rsa.pub’) }}"
    loop: "{{ users }}"
  - name: copy sudoers file
    copy:
      content: ‘%project_admins ALL=(ALL:ALL) NOPASSWD:ALL’
      dest: /etc/sudoers.d/project_admins
- **运行playbook**:使用`ansible-playbook project_setup.yaml`命令运行playbook,完成用户创建和配置。
13. 拓展与延伸

Ansible的功能非常丰富,除了上述介绍的内容,还可以进行更多的拓展和延伸:
- 自动化部署 :结合其他模块和工具,实现应用程序的自动化部署。
- 批量管理 :对多个主机进行批量管理,提高工作效率。
- 集成其他系统 :与其他系统(如监控系统、日志系统)进行集成,实现更全面的管理。

通过不断学习和实践,我们可以充分发挥Ansible的优势,实现更高效、更自动化的系统管理。

14. 总结

通过本文的学习,我们全面了解了Ansible在用户管理、SSH密钥设置和加密密码管理等方面的操作方法。从基本的模块使用到高级场景练习,再到实战案例分析和拓展延伸,我们逐步掌握了Ansible的核心技能。在实际应用中,要注意细节,灵活运用各种技巧和方法,不断提升自己的Ansible使用水平。希望本文能为你在Ansible的学习和实践中提供有价值的参考。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值