1. 国产化环境下的自动化运维挑战与选型
在信息技术应用创新产业快速发展的今天,越来越多的企业和机构开始将业务系统迁移到国产操作系统和硬件平台上。我最近在某金融客户的信创项目中发现,当服务器规模超过50台时,传统手工运维方式已经难以满足日常管理需求。通过对比测试,最终选择了Ansible和SaltStack这两款主流工具构建自动化运维体系,在统信UOS和麒麟OS上实现了批量配置管理效率提升300%的效果。
为什么同时采用两种工具?Ansible无代理架构适合基础环境初始化,而SaltStack的实时响应特性更利于监控告警处理。这种组合拳策略在实际运维中表现出极强的适应性——既可以利用Ansible的简单易用快速搭建基础环境,又能通过SaltStack的高效通讯实现实时运维管控。下面分享我们在国产化环境中的具体实践路径。
2. 基础环境适配与工具部署
2.1 国产系统兼容性处理
在统信UOS 20专业版上部署时,需要特别注意Python环境的适配。由于系统默认使用Python 3.7,而Ansible 2.9+需要Python 3.8+支持,我们通过以下步骤解决:
bash复制# 添加优麒麟源获取新版Python
sudo add-apt-repository ppa:ubuntukylin-members/python3.8
sudo apt update
sudo apt install python3.8 python3.8-dev
# 设置替代版本
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
对于麒麟V10系统,默认已安装Python 3.6,需要额外安装libselinux-python3包才能正常使用Ansible的yum模块:
bash复制sudo yum install libselinux-python3 python3-pip
重要提示:国产系统软件源可能存在证书问题,若遇到SSL验证错误,可临时在pip命令后添加
--trusted-host mirrors.xxx.com参数
2.2 工具部署方案对比
我们设计了两种部署架构应对不同场景:
Ansible集中式部署
- 控制节点:1台高配服务器(16C32G)
- 受管节点:通过SSH密钥认证连接
- 特点:无需在被管端安装客户端,适合初期快速实施
SaltStack分级部署
- Master节点:2台做高可用
- Minion节点:自动注册到Master
- Syndic节点:用于跨机房分级管理
- 特点:实时性强,适合大规模集群
实际部署中发现,Ansible在统信系统上的playbook执行速度比CentOS慢约15%,这主要与国产系统默认的安全策略有关。通过调整以下参数可显著提升性能:
ini复制# ansible.cfg优化项
[ssh_connection]
pipelining = True
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
3. 核心功能实现与批量管理
3.1 系统初始化标准化
创建跨平台的基线配置playbook时,需要处理不同国产系统的包管理差异。我们使用when条件语句实现智能判断:
yaml复制- name: Install base packages
hosts: all
tasks:
- name: UOS package install
apt:
name: "{{ uos_packages }}"
update_cache: yes
when: ansible_distribution == "UOS"
- name: Kylin package install
yum:
name: "{{ kylin_packages }}"
update_cache: yes
when: ansible_distribution == "Kylin"
对于安全加固这类通用操作,我们开发了可复用的role,包含:
- 账户策略设置
- SSH安全配置
- 防火墙规则管理
- 审计日志配置
3.2 配置漂移检测机制
利用SaltStack的state.sls功能实现配置合规检查,以下示例检测/etc/ssh/sshd_config的变更:
sls复制/etc/ssh/sshd_config:
file.managed:
- source: salt://base/sshd_config
- user: root
- group: root
- mode: 600
- template: jinja
- require:
- pkg: openssh-server
sshd_config_audit:
cmd.run:
- name: salt-call --local file.get_hash /etc/ssh/sshd_config
- output_loglevel: quiet
- only_if: test -f /etc/ssh/sshd_config
- run_once: True
- state_aggregate:
data:
sshd_hash: {{ salt['file.get_hash']('/etc/ssh/sshd_config') }}
通过SaltStack的schedule功能定期执行检查,将结果存入MySQL数据库进行分析。我们开发了可视化看板展示配置偏离情况,帮助运维人员快速定位问题节点。
4. 混合环境管理实践
4.1 跨平台文件分发方案
在同时管理ARM和x86架构服务器的场景下,文件分发需要特别注意二进制兼容性。我们采用以下策略:
- 在playbook中自动识别架构:
yaml复制- name: Distribute arch-specific binaries
copy:
src: "files/{{ ansible_architecture }}/app_binary"
dest: /usr/local/bin/app
mode: 0755
- 使用SaltStack的file.recurse管理目录结构:
sls复制/opt/app:
file.recurse:
- source: salt://app/files
- template: jinja
- defaults:
arch: {{ grains['cpuarch'] }}
4.2 国产数据库集群管理
针对达梦数据库集群的运维,我们开发了专用模块:
python复制# ansible_dm8.py
def dm8_status():
"""检查达梦数据库实例状态"""
cmd = "/dm8/bin/DmService status"
return subprocess.getoutput(cmd)
def dm8_exec_sql(instance, sql):
"""执行SQL语句"""
cmd = f"/dm8/bin/disql SYSDBA/SYSDBA@{instance} << EOF\n{sql}\nEOF"
return subprocess.getoutput(cmd)
结合Ansible的custom module机制,可以实现如下调用:
yaml复制- name: Check DM8 status
dm8_status:
register: db_status
- name: Create backup user
dm8_exec_sql:
instance: "{{ dm_instance }}"
sql: |
CREATE USER BACKUP_ADMIN IDENTIFIED BY "Backup@123";
GRANT BACKUP DATABASE TO BACKUP_ADMIN;
5. 性能优化与问题排查
5.1 执行效率提升技巧
在管理500+节点的生产环境中,我们发现以下优化措施效果显著:
- Ansible加速方案
- 开启SSH长连接:
ini复制[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
- 使用Mitogen插件:
bash复制ansible-playbook --strategy=mitogen_linear playbook.yml
- SaltStack批量操作优化
- 启用批处理模式:
bash复制salt -L 'node1,node2,node3' --batch-size 25% cmd.run 'service nginx restart'
- 使用SSH传输压缩:
yaml复制# master配置
ssh_compression: True
ssh_compression_level: 3
5.2 典型问题处理记录
问题1:在麒麟系统上Salt Minion频繁断开连接
- 现象:Master日志显示"Minion did not return"
- 排查:
- 检查
salt-minion --versions-report确认版本匹配 - 使用
salt-call --local test.ping测试本地服务 - 通过
journalctl -u salt-minion发现内存不足
- 检查
- 解决:
yaml复制# /etc/salt/minion.d/optimization.conf
worker_threads: 5
ping_interval: 10
问题2:Ansible在UOS上执行apt模块超时
- 现象:Task卡在"Waiting for cache lock"
- 排查:
- 手动执行
apt update确认源响应速度 - 检查
lsof /var/lib/dpkg/lock-frontend
- 手动执行
- 解决:
yaml复制- name: Force apt lock release
shell: |
sudo fuser -vki /var/lib/dpkg/lock
sudo rm -f /var/lib/dpkg/lock-frontend
ignore_errors: yes
6. 安全加固与审计方案
6.1 通信安全配置
对于生产环境,必须加强工具自身的通信安全:
Ansible安全增强
ini复制[defaults]
transport = ssh
# 禁用不安全的特性
allow_world_readable_tmpfiles = False
host_key_checking = True
# 启用日志审计
log_path = /var/log/ansible.log
SaltStack TLS加密
yaml复制# master配置
ssl:
keyfile: /etc/salt/pki/master/ssl/master.key
certfile: /etc/salt/pki/master/ssl/master.crt
ssl_version: PROTOCOL_TLSv1_2
# minion配置
master_alive_interval: 60
auth_timeout: 60
6.2 操作审计实现
通过组合工具实现完整审计链:
- Ansible日志记录
python复制# callback_plugins/audit_logger.py
class CallbackModule(CallbackBase):
def v2_runner_on_ok(self, result):
with open('/var/log/ansible_audit.log', 'a') as f:
f.write(f"{time.ctime()} | {result._host.name} | {result._task.action}\n")
- SaltStack事件监控
sls复制# reactor配置
/salt/beacon/*/inotify//etc/passwd:
runner.state.sls:
- args:
mods: security.alert
- 国产审计系统对接
python复制# 将审计日志发送到网神审计系统
import requests
def send_to_audit_sys(log):
headers = {'X-Auth-Token': 'xxxx'}
data = {
"logs": [{
"host": log['host'],
"user": log['user'],
"action": log['action']
}]
}
requests.post('https://audit/api/v1/logs',
json=data, headers=headers)
7. 国产化生态集成
7.1 中间件自动化管理
针对东方通TongWeb应用服务器的管理,我们开发了专用playbook:
yaml复制- name: Deploy TongWeb instance
hosts: app_servers
vars:
tongweb_home: /opt/TongWeb
tasks:
- name: Install license
copy:
src: license.dat
dest: "{{ tongweb_home }}/license/"
- name: Configure cluster
template:
src: tongweb.conf.j2
dest: "{{ tongweb_home }}/conf/server.xml"
notify: restart tongweb
handlers:
- name: restart tongweb
command: "{{ tongweb_home }}/bin/restart.sh"
async: 300
poll: 0
7.2 信创监控体系构建
将运维数据对接到国产监控平台:
- Ansible结果推送
python复制# callback_plugins/monitor.py
def v2_playbook_on_stats(self, stats):
for host in stats.processed.keys():
metrics = {
'host': host,
'ok': stats.ok.get(host, 0),
'changed': stats.changed.get(host, 0)
}
requests.post('http://monitor/api/metrics', json=metrics)
- SaltStack数据采集
sls复制# beacon配置
beacons:
systemstats:
- interval: 60
- disks:
- /
- loadavg: all
- memory: all
- 统信UOS性能监控
bash复制# 使用deepin-monitor-cli获取系统数据
deepin-monitor-cli --cpu --mem --disk -f json