服务升级 Playbook
创建主机清单文件
1
2
3
4
5
6cat > /etc/ansible/hosts.ini <<EOF
# 云主机清单
[YZJ]
192.11.14.13 ansible_user=root ansible_ssh_pass=IxxsdasddwaXXXXXXX description="Web 主机"
192.11.14.[59:61] user=root ansible_ssh_pass=DXXXXXSCDDSSXCXSSk description="Kafka集群"
EOF编写 Ansible Playbook 批量升级 Agent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150- name: "平台探针 Agent 升级(2026-08-27)"
hosts: all
gather_facts: yes
vars:
target_port: 11181
old_port: 61238
tasks:
- name: "检测系统架构"
ansible.builtin.debug:
msg: "检测到系统架构: {{ ansible_architecture }}"
- name: "按架构设置源文件路径"
ansible.builtin.set_fact:
server_source_path: "{% if ansible_architecture == 'x86_64' %}/opt/server/x86/monitor{% elif ansible_architecture in ['aarch64', 'arm64'] %}/opt/server/arm/monitor{% else %}unknown_architecture{% endif %}"
- name: "验证源文件是否存在"
ansible.builtin.stat:
path: "{{ server_source_path }}"
register: source_file_check
delegate_to: localhost
- name: "复制安装包到目标主机"
ansible.builtin.copy:
src: "{{ server_source_path }}"
dest: /usr/local/src/server/
remote_src: no
force: yes
when:
- server_source_path != "unknown_architecture"
- source_file_check.stat.exists
- name: "设置安装脚本可执行权限"
ansible.builtin.file:
path: "{{ item }}"
mode: "0755"
state: file
loop:
- /usr/local/src/server/monitor/install
- /usr/local/src/server/monitor/uninstall
- /usr/local/src/server/monitor/restart_plugin
when: server_source_path != "unknown_architecture"
- name: "停止并禁用旧版本 tidu_agent 服务"
systemd:
name: tidu_agent
state: stopped
enabled: no
ignore_errors: yes
- name: "停止并禁用旧版本 tdma 服务"
systemd:
name: tdma
state: stopped
enabled: no
ignore_errors: yes
- name: "停止并禁用旧版本 tdma-guard 服务"
systemd:
name: tdma-guard
state: stopped
enabled: no
ignore_errors: yes
- name: "卸载 Agent 程序"
command: /usr/local/src/server/monitor/uninstall
register: uninstall_result
ignore_errors: yes
when: server_source_path != "unknown_architecture"
- name: "检查端口 {{ old_port }} 并获取PID"
shell: "lsof -ti:{{ old_port }}"
register: old_port_check
ignore_errors: yes
- name: "杀掉占用端口 {{ old_port }} 的进程"
shell: "kill -9 {{ old_port_check.stdout }}"
when: old_port_check.rc == 0 and old_port_check.stdout | length > 0
- name: "等待端口 {{ old_port }} 关闭"
wait_for:
port: "{{ old_port }}"
state: stopped
timeout: 10
when: old_port_check.rc == 0
- name: "清理历史文件"
ansible.builtin.file:
path: "{{ item }}"
state: absent
loop:
- /usr/local/server
- /etc/systemd/system/tidu_agent.service
- /etc/systemd/system/tdma.service
- /etc/systemd/system/tdma-guard.service
- /etc/agent-jump-hosts
- name: "复制 Agent 配置文件到目标主机"
ansible.builtin.copy:
src: /opt/server/agent-jump-hosts
dest: /etc/agent-jump-hosts
remote_src: no
force: yes
when:
- server_source_path != "unknown_architecture"
- source_file_check.stat.exists
- name: "执行安装脚本"
command: ./install
args:
chdir: /usr/local/src/server/monitor
register: install_result
ignore_errors: yes
when: server_source_path != "unknown_architecture"
- name: "等待服务启动"
ansible.builtin.wait_for:
port: "{{ target_port }}"
state: started
timeout: 60
delay: 5
register: port_check
when: server_source_path != "unknown_architecture"
- name: "显示安装结果"
ansible.builtin.debug:
msg:
- "安装脚本退出状态: {{ install_result.rc }}"
- "安装脚本è¾出: {{ install_result.stdout }}"
- "安装脚本错误: {{ install_result.stderr }}"
when:
- server_source_path != "unknown_architecture"
- install_result is defined
- name: "验证部署结果"
ansible.builtin.assert:
that:
- port_check is succeeded
success_msg: "✅ Agent 部署成功 - 端口 {{ target_port }} 正常监听"
fail_msg: "❌ Agent 部署失败 - 端口 {{ target_port }} 未启动"
when: server_source_path != "unknown_architecture"
- name: "部署总结"
ansible.builtin.debug:
msg: |
📋 部署总结:
主机: {{ inventory_hostname }}
架构: {{ ansible_architecture }}
状态: {% if port_check is succeeded %}成功{% else %}失败{% endif %}
端口: {{ target_port }}执行升级
1
2
3
4
5
6
7
8# 关闭 Python 接口告警信息提示
export ANSIBLE_PYTHON_INTERPRETER=/usr/bin/python
# 关闭 主机秘钥认真信息
export ANSIBLE_HOST_KEY_CHECKING=False
# 仅针对 Web 分组执行 Playbook
ansible-playbook -i host.txt agent_deploy.yml -e "ansible_ssh_common_args='-o StrictHostKeyChecking=no'" --limit Web
