管理服务器优化¶
在本章中,我们将回顾可能有助于优化我们的 Ansible 管理服务器的配置选项。
ansible.cfg
配置文件¶
一些有趣的配置选项需要说明
-
forks
:默认值为 5,这是 Ansible 将并行启动的进程数量,用于与远程主机通信。这个数字越高,Ansible 就可以同时管理更多的客户端,从而加快处理速度。您可以设置的值取决于您的管理服务器的 CPU/RAM 限制。请注意,默认值5
非常小,Ansible 文档指出许多用户将其设置为 50,甚至 500 或更多。 -
gathering
:此变量更改收集 facts 的策略。默认情况下,值为implicit
,这意味着 facts 将被系统地收集。将此变量切换到smart
可以仅在 facts 尚未收集时才进行收集。结合 facts 缓存(见下文),此选项可以大大提高性能。 -
host_key_checking
:请注意您的服务器安全!但是,如果您能够控制您的环境,禁用远程服务器的密钥控制以节省连接时间可能会很有趣。您还可以在远程服务器上禁用 SSH 服务器的 DNS 使用(在/etc/ssh/sshd_config
文件中,选项UseDNS no
),此选项会浪费连接时间,并且大多数时候仅用于连接日志。 -
ansible_managed
:此变量默认包含Ansible managed
,通常用于部署到远程服务器的文件模板中。它允许您向管理员指定该文件是自动管理的,并且他们对其进行的任何更改都可能会丢失。让管理员获得更完整的信息可能会很有趣。但请注意,如果您更改此变量,可能会导致守护进程重新启动(通过与模板关联的 handlers)。 -
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
选项(请参阅文档)。
缓存 facts¶
收集 facts 是一个可能花费一些时间的过程。对于不需要它的 playbook(通过 gather_facts
选项)禁用此收集,或者将这些 facts 在缓存中保留一段时间(例如 24 小时)可能很有趣。
这些 facts 可以轻松地存储在 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 导出 facts
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