跳至内容

管理服务器优化

在本章中,我们将回顾可能有助于优化我们的 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