跳过内容

管理服务器优化

在本节中,我们将回顾可能对优化我们的 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