管理服务器优化¶
在本节中,我们将回顾可能对优化我们的 Ansible 管理服务器感兴趣的配置选项。
ansible.cfg
配置文件¶
一些有趣的配置选项需要评论
forks
: 默认值为 5,它是 Ansible 将并行启动以与远程主机通信的进程数。此数字越大,Ansible 能够同时管理的客户端就越多,从而加快处理速度。您可以设置的值取决于管理服务器的 CPU/RAM 限制。请注意,默认值5
非常小,Ansible 文档指出许多用户将其设置为 50,甚至 500 或更多。gathering
: 此变量更改收集事实的策略。默认情况下,该值为implicit
,这意味着将系统地收集事实。将此变量切换到smart
允许仅在未收集事实时才收集事实。结合事实缓存(见下文),此选项可以极大地提高性能。host_key_checking
: 注意服务器安全性!但是,如果您控制自己的环境,禁用远程服务器的密钥控制并节省一些连接时间可能很有趣。您也可以在远程服务器上禁用 SSH 服务器的 DNS 使用(在/etc/ssh/sshd_config
中,选项UseDNS no
),此选项浪费连接时间,并且大多数情况下仅用于连接日志。ansible_managed
: 此变量默认情况下包含Ansible managed
,通常用于部署在远程服务器上的文件模板中。它允许您向管理员指定该文件是自动管理的,并且他们对该文件所做的任何更改都可能会丢失。让管理员拥有更完整的消息可能很有趣。但请注意,如果您更改此变量,它可能会导致守护进程重新启动(通过与模板关联的处理程序)。ssh_args = -C -o ControlMaster=auto -o ControlPersist=300s -o PreferredAuthentications=publickey
: 指定 ssh 连接选项。通过禁用除公钥之外的所有身份验证方法,您可以节省大量时间。您还可以增加ControlPersist
以提高性能(文档建议使用相当于 30 分钟的值可能很合适)。与客户端的连接将保持更长时间,并且在重新连接到同一服务器时可以重复使用,这可以节省大量时间。control_path_dir
: 指定连接套接字的路径。如果此路径过长,可能会导致问题。考虑将其更改为简短的路径,例如/tmp/.cp
。pipelining
: 将此值设置为True
通过减少运行远程模块所需的 SSH 连接次数来提高性能。您必须首先确保在sudoers
选项中禁用了requiretty
选项(参见文档)。
缓存事实¶
收集事实是一个可能需要一些时间的过程。对于不需要收集事实的剧本,禁用此收集(通过 gather_facts
选项)或将这些事实保存在内存中的缓存中一段时间(例如 24 小时)可能很有趣。
这些事实可以轻松地存储在 redis
数据库中
sudo yum install redis
sudo systemctl start redis
sudo systemctl enable redis
sudo pip3 install redis
不要忘记修改 ansible 配置
fact_caching = redis
fact_caching_timeout = 86400
fact_caching_connection = localhost:6379:0
要检查正确操作,只需请求 redis
服务器即可
redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> get ansible_facts_SERVERNAME
使用 Vault¶
各种密码和机密不能以纯文本形式存储在 Ansible 源代码中,无论是在本地管理服务器上还是在可能的源代码管理器上。
Ansible 建议使用加密管理器:ansible-vault
。
原则是使用 ansible-vault
命令加密变量或整个文件。
Ansible 将能够在运行时通过从文件(例如)/etc/ansible/ansible.cfg
中检索加密密钥来解密此文件。后者也可以是 python 脚本或其他。
编辑 /etc/ansible/ansible.cfg
文件
#vault_password_file = /path/to/vault_password_file
vault_password_file = /etc/ansible/vault_pass
将密码存储在此文件中 /etc/ansible/vault_pass
并分配必要的限制性权限
mysecretpassword
然后,您可以使用以下命令加密文件
ansible-vault encrypt myfile.yml
由 ansible-vault
加密的文件很容易通过其标题识别
$ANSIBLE_VAULT;1.1;AES256
35376532343663353330613133663834626136316234323964333735363333396136613266383966
6664322261633261356566383438393738386165333966660a343032663233343762633936313630
34373230124561663766306134656235386233323964336239336661653433663036633334366661
6434656630306261650a313364636261393931313739363931336664386536333766326264633330
6334
加密文件后,仍然可以使用以下命令对其进行编辑
ansible-vault edit myfile.yml
您还可以将密码存储导出到任何密码管理器。
例如,要检索存储在 rundeck vault 中的密码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request
import io
import ssl
def get_password():
'''
:return: Vault password
:return_type: str
'''
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
url = 'https://rundeck.rockylinux.org/api/11/storage/keys/ansible/vault'
req = urllib.request.Request(url, headers={
'Accept': '*/*',
'X-Rundeck-Auth-Token': '****token-rundeck****'
})
response = urllib.request.urlopen(req, context=ctx)
return response.read().decode('utf-8')
if __name__ == '__main__':
print(get_password())
使用 Windows 服务器¶
需要在管理服务器上安装几个软件包
- 通过包管理器
sudo dnf install python38-devel krb5-devel krb5-libs krb5-workstation
并配置 /etc/krb5.conf
文件以指定正确的 realms
[realms]
ROCKYLINUX.ORG = {
kdc = dc1.rockylinux.org
kdc = dc2.rockylinux.org
}
[domain_realm]
.rockylinux.org = ROCKYLINUX.ORG
- 通过 python 包管理器
pip3 install pywinrm
pip3 install pywinrm[credssp]
pip3 install kerberos requests-kerberos
使用 IP 模块¶
网络模块通常需要 netaddr
python 模块
sudo pip3 install netaddr
生成 CMDB¶
已开发出一种工具 ansible-cmdb
,用于从 ansible 生成 CMDB。
pip3 install ansible-cmdb
必须使用以下命令导出 ansible 的事实
ansible --become --become-user=root -o -m setup --tree /var/www/ansible/cmdb/out/
然后,您可以生成一个全局 json
文件
ansible-cmdb -t json /var/www/ansible/cmdb/out/linux > /var/www/ansible/cmdb/cmdb-linux.json
如果您更喜欢 web 界面
ansible-cmdb -t html_fancy_split /var/www/ansible/cmdb/out/
作者:Antoine Le Morvan
贡献者:Steven Spencer, Ganna Zhyrnova