1. Ansible 配置文件概览
1.1 ansible.cfg 文件配置
Ansible 的 ansible.cfg
文件是 Ansible 客户端的配置文件,通常位于 /etc/ansible/
目录下。该文件控制着 Ansible 的各种默认行为,包括但不限于日志记录、主机密钥检查、默认的库存文件路径等。
- 日志记录:可以通过配置文件设置日志级别,以便在执行任务时记录详细的信息,有助于调试和审计。
- 主机密钥检查:
host_key_checking
选项控制 Ansible 是否检查目标主机的 SSH 密钥。出于安全考虑,通常建议将其设置为False
。 - 库存文件路径:
inventory
选项指定了 Ansible 库存文件的位置,默认为/etc/ansible/hosts
。
1.2 hosts 文件配置
Ansible 的 hosts
文件是 Ansible 的库存文件,它定义了 Ansible 管理的主机列表。在该文件中,可以为每台主机或主机组指定用户名、密码、SSH 端口号等信息。
- 主机别名:为每台主机或主机组设置别名,便于在 Playbook 中引用。
- SSH 端口:通过
ansible_ssh_port
变量指定 SSH 连接使用的端口号。 - 默认用户:
ansible_ssh_user
变量定义了连接远程主机时使用的默认用户。 - 密码管理:虽然可以在
hosts
文件中直接使用ansible_ssh_pass
变量设置密码,但出于安全考虑,推荐使用 SSH 密钥认证或 Ansible Vault 加密敏感信息。
在 hosts
文件中配置密码时,可以使用以下格式:
[webservers]
192.168.1.100 ansible_ssh_user=root ansible_ssh_pass=secret_password
192.168.1.101 ansible_ssh_user=root ansible_ssh_pass=another_secret_password
或者,对于使用 sudo 的情况:
[dbservers]
192.168.1.200 ansible_ssh_user=ubuntu ansible_ssh_pass=db_password ansible_sudo_pass=sudo_password
为了提高安全性,可以使用 Ansible Vault 对 hosts
文件进行加密:
ansible-vault encrypt /etc/ansible/hosts
在需要编辑或使用加密的 hosts
文件时,需要提供 Vault 密码:
ansible-vault edit /etc/ansible/hosts --ask-vault-pass
执行 Ansible 命令时,如果需要使用到加密的 hosts
文件,可以使用 --ask-vault-pass
选项来提示输入 Vault 密码:
ansible -i /etc/ansible/hosts all -m ping --ask-vault-pass
这种方式确保了密码等敏感信息的安全,防止在明文中暴露。
2. 配置用户名和密码
2.1 ansible_ssh_user 和 ansible_ssh_pass
在Ansible中,ansible_ssh_user
和 ansible_ssh_pass
是用于定义远程主机连接时使用的用户名和密码的变量。这些变量可以直接在inventory文件中设置,以便在执行任务时进行身份验证。
- 默认情况下,Ansible使用
root
用户进行连接,但可以通过设置ansible_ssh_user
来更改为其他用户。 - 密码可以通过
ansible_ssh_pass
变量在inventory文件中直接设置,但这种做法存在安全风险,因为明文密码可能会被未经授权的人访问。 - 为了提高安全性,推荐使用SSH密钥认证代替密码。但如果必须使用密码,可以通过Ansible Vault对包含密码的文件进行加密,确保敏感信息的安全。
2.2 使用 SSH 密钥代替密码
SSH密钥认证是一种更安全的远程主机访问方式,它可以避免在inventory文件中存储明文密码。
SSH密钥对包括一个私钥和一个公钥。私钥存储在本地,公钥存储在远程主机上。
通过
ssh-keygen
命令生成SSH密钥对,然后使用ssh-copy-id
命令将公钥复制到远程主机的~/.ssh/authorized_keys
文件中,从而实现免密登录。在Ansible的inventory文件中,可以通过设置
ansible_ssh_private_key_file
变量来指定私钥文件的路径,从而使用SSH密钥进行认证。使用SSH密钥认证不仅可以提高安全性,还可以减少在执行任务时输入密码的麻烦,特别是在自动化任务中非常有用。
此外,SSH密钥认证还可以通过Ansible的
known_hosts
模块进行管理,自动处理主机密钥的验证和存储。3. SSH 密钥管理
3.1 生成 SSH 密钥对
SSH 密钥对的生成是 Ansible 自动化过程中关键的一步,它允许无密码远程登录,增强了安全性并简化了管理过程。
密钥对生成:使用
ssh-keygen
命令,用户可以选择生成 RSA、DSA 或 ECDSA 密钥对。通常情况下,默认的 RSA 密钥对已足够使用。密钥长度:建议至少使用 2048 位的密钥长度,以确保足够的安全性。对于更高级的安全需求,可以选择 4096 位或更长的密钥长度。
密钥存储:生成的私钥(如
id_rsa
)应妥善保管,不应泄露或共享。公钥(如id_rsa.pub
)则需要复制到远程主机上,以便进行认证。
3.2 复制公钥到远程主机
将公钥复制到远程主机是实现 SSH 免密登录的关键步骤,Ansible 提供了多种方式来完成这一过程。
使用
ssh-copy-id
命令:这是最常用的方法,可以直接将公钥复制到远程主机的~/.ssh/authorized_keys
文件中。使用 Ansible 模块:Ansible 的
authorized_key
模块允许在 Playbook 中自动化这一过程,可以指定用户、公钥内容以及管理权限等。批量操作:在管理大量主机时,可以编写 Ansible Playbook 来批量复制公钥,这样可以大大减少手动操作的繁琐性。
权限和安全性:确保远程主机的
~/.ssh/
目录和authorized_keys
文件的权限设置正确,通常目录权限为 700,文件权限为 600,以防止未授权访问。4. 使用 ansible-vault 加密敏感信息
4.1 创建和编辑加密文件
ansible-vault 是 Ansible 提供的一个强大工具,用于加密敏感信息,如账号密码等。它使用 AES 加密算法来确保数据的安全性。
创建加密文件:首先,使用
ansible-vault create
命令创建一个新的加密文件。例如,ansible-vault create secrets.yml
将会创建一个名为secrets.yml
的加密文件,并提示用户输入一个密码,该密码将用于加密和解密文件。编辑加密文件:如果需要修改已加密的文件,可以使用
ansible-vault edit
命令。例如,ansible-vault edit secrets.yml --ask-vault-pass
将会解锁文件以供编辑,并在完成后重新加密。协同工作:在团队环境中,加密文件的密码可以通过安全的方式共享,如使用密码管理工具或通过环境变量传递,以确保团队成员可以访问和管理敏感配置。
4.2 在执行时使用加密信息
在 Ansible Playbook 或命令执行过程中,可以使用 --ask-vault-pass
选项来提示输入加密文件的密码,从而动态地加载加密的敏感信息。
执行 Playbook:在运行 Playbook 时,如果涉及到加密的变量文件,可以使用
ansible-playbook site.yml --ask-vault-pass
命令来执行,系统会提示输入密码以解密所需的变量。命令行工具:在命令行工具中,也可以使用
ansible -i inventory.ini all -m ping --ask-vault-pass
来测试主机的连接性,同时使用加密的密码。集成到 CI/CD:在持续集成和持续部署的流程中,ansible-vault 可以与 Jenkins、GitLab CI 等工具集成,通过在 CI/CD 配置中设置环境变量或使用密钥管理服务来安全地使用加密信息。
安全审计:使用加密的敏感信息可以提高审计的安全性,因为密码和密钥不会在日志文件或历史记录中以明文形式出现,从而降低了泄露的风险。
5. 测试 SSH 连接
5.1 使用 ping 模块测试
使用 Ansible 的 ping 模块可以快速检测目标主机是否可达,这对于验证 SSH 连接是否正常工作是一个简单有效的方法。
命令示例:
ansible all -m ping -u username -k
输出结果:如果 SSH 连接配置正确,命令执行后将显示所有目标主机的
pong
响应,表明 Ansible 成功连接到远程主机。常见问题:如果出现
FAILED
或UNREACHABLE
响应,需要检查 SSH 连接配置,包括用户名、密码、密钥文件路径等是否正确。
5.2 使用 SSH 密钥测试连接
SSH 密钥测试是验证公钥是否成功部署到远程主机并能够实现免密登录的关键步骤。
命令示例:
ansible all -m ping -u username --private-key=/path/to/private/key
输出结果:如果公钥部署正确,使用私钥进行 SSH 连接时,Ansible 能够无需密码验证直接连接到远程主机,并返回
pong
响应。常见问题:如果出现连接失败,可能是由于以下原因:
私钥文件路径错误或文件权限设置不当。
公钥未正确添加到远程主机的
~/.ssh/authorized_keys
文件中。远程主机的 SSH 配置文件
/etc/ssh/sshd_config
未正确设置以允许密钥认证(PubkeyAuthentication yes
)。密钥文件的权限设置不正确,通常私钥文件的权限应为
600
,公钥文件的权限应为644
。6. 配置 SSH 服务端以接受密钥认证
6.1 设置 sshd_config 文件
在Ansible中配置SSH服务端以接受密钥认证,首先需要编辑
sshd_config
文件,这是SSH服务的配置文件,通常位于/etc/ssh/sshd_config
。
PubkeyAuthentication:确保在
sshd_config
文件中设置PubkeyAuthentication
选项为yes
,这一设置允许使用公钥认证方式。AuthorizedKeysFile:通常,公钥会被存储在用户的
~/.ssh/authorized_keys
文件中,sshd_config
文件中的AuthorizedKeysFile
选项应正确指向该文件。StrictModes:设置
StrictModes
为yes
可以确保在~/.ssh
目录和authorized_keys
文件的权限设置正确,防止潜在的安全风险。PasswordAuthentication:如果希望仅允许密钥认证,可以将
PasswordAuthentication
设置为no
,这样可以禁用密码认证。PermitEmptyPasswords:如果
PasswordAuthentication
被设置为no
,同时应确保PermitEmptyPasswords
也为no
,以防止空密码登录。UsePAM:设置
UsePAM
为yes
可以启用PAM(可插拔认证模块),这为SSH认证提供了额外的灵活性和安全性。X11Forwarding:如果需要X11转发,确保
X11Forwarding
选项被设置为yes
,这允许通过SSH会话转发X11应用程序。
6.2 重启 SSH 服务
配置完sshd_config
文件后,需要重启SSH服务以使更改生效。在大多数Linux发行版中,可以使用以下命令来重启SSH服务:
sudo systemctl restart sshd
或者在某些系统中,可能需要使用service
命令:
sudo service ssh restart
重启服务后,可以通过尝试使用SSH密钥登录来验证配置是否成功。如果遇到问题,可以检查/var/log/auth.log
或/var/log/secure
日志文件(取决于系统)来诊断问题。
1. Ansible账号密码管理
1.1 密码管理的重要性
在Ansible中,账号密码管理是确保自动化操作安全性的关键环节。密码的不当管理可能导致安全漏洞,给系统带来风险。
1.2 密码管理的挑战
- 多环境管理:在不同的环境(开发、测试、生产)中,Ansible需要管理不同的账号和密码,增加了管理复杂性。
- 安全性与便捷性的平衡:在保证安全性的同时,也需要考虑到操作的便捷性,避免因为复杂的密码管理流程而影响运维效率。
2. Ansible密码管理实践
2.1 使用SSH密钥对认证
- 密钥对生成:使用
ssh-keygen
命令生成SSH密钥对,提高认证的安全性。 - 公钥分发:通过
ssh-copy-id
命令将公钥复制到远程主机,实现免密码登录。
2.2 使用Ansible Vault加密敏感信息
- 加密hosts文件:使用
ansible-vault encrypt
命令对包含敏感信息的hosts文件进行加密。 - 编辑加密文件:使用
ansible-vault edit
命令编辑加密的文件,确保在操作过程中敏感信息的安全。
2.3 密码管理的最佳实践
- 定期更换密码:定期更换Ansible管理账号的密码,减少密码泄露的风险。
- 使用强密码:生成复杂的密码,并使用密码管理工具来存储和管理密码。
3. Ansible密码管理工具
3.1 sshpass工具的使用
- 非交互式密码输入:在需要时,可以使用
sshpass
工具来实现非交互式的密码输入,方便自动化脚本的执行。
3.2 Ansible内置模块
user
模块:用于管理远程主机的用户账号,包括密码的设置和修改。authorized_key
模块:用于管理远程主机用户的SSH公钥,实现免密码登录。
4. 密码管理的安全策略
4.1 最小权限原则
- 为Ansible管理账号分配最小必要的权限,减少安全风险。
4.2 审计和监控
- 定期审计账号和密码的使用情况,监控异常登录行为,及时发现和响应安全事件。
5. 密码管理的未来发展
5.1 多因素认证
- 探索在Ansible中实施多因素认证的可能性,进一步提高安全性。
5.2 密码管理服务的集成
- 考虑将Ansible与现代密码管理服务(如HashiCorp Vault)集成,利用其强大的密码和密钥管理功能。