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:
-
添加第一个任务,使用
debug模块生成加密密码字符串,并使用register将字符串存储在变量mypass中:
- debug:
msg: "{{ ‘{{ passw }}’| password_hash(
‘sha512’,’myrandomsalt’) }}"
register: mypass
-
添加
debug模块分析注册变量的准确格式:
- debug:
var: mypass
-
首次运行
ansible-playbook exercise133.yaml,查看需要使用的变量的确切名称。 -
根据上一步的输出,使用
user模块正确引用密码:
- name: create the user
user:
name: "{{ user }}"
password: "{{ mypass.msg }}"
-
再次运行
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
-
填充详细内容
从第一个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 }}"
-
初步验证
暂时注释掉整个第二个play,使用ansible-playbook -C exercise134.yaml命令在检查模式下运行playbook。若出现错误,修正后再次运行。 -
完成第一个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
- 完成复制授权密钥任务
- 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
-
配置sudo文件
使用copy模块配置/etc/sudoers.d/目录下的sudo文件:
- name: copy sudoers file
copy:
content: ‘%admins ALL=(ALL:ALL) NOPASS
WD:ALL’
dest: /etc/sudoers.d/admins
-
验证并运行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的学习和实践中提供有价值的参考。
超级会员免费看
55

被折叠的 条评论
为什么被折叠?



