Windows 作为 Ansible 节点的完整部署流程(含 Docker 部署 Ansible) - 实践

news/2025/10/1 21:51:18/文章来源:https://www.cnblogs.com/lxjshuju/p/19122936

前言

在日常运维中,Windows 主机上往往存在大量的 bat、ps1 脚本,每台机器跑的脚本还不一样,有些甚至需要多台机器联动。手动维护既麻烦,又容易出错。

我的场景里,Windows 系统非常关键,不允许开发人员或普通用户随意访问,因此需要一个安全、统一的方式来管理这些脚本。

最开始考虑的方案是 JenkinsAnsible

  • Jenkins 的优势在于能直观看到节点是否在线,但权限粒度不足:用户可以新建任意任务并选择指定节点执行,风险太大(比如误操作删除文件)。

    目前开发同事工作需要登录 Jenkins 并创建 Job。

  • Ansible 没有内置的节点在线监控,且 Windows 作为节点无需额外安装 agent 和开启 SSH 服务器,只要启用系统自带的 WinRM 功能即可。

    Ansible 目前完全由 IT 管理,不用担心权限泄露问题

综合考虑后,还是选择了 Ansible 来统一管理 Windows 脚本。下面记录下从原理到完整落地的全过程。


一、工作原理

Windows 作为 Ansible 节点的核心机制,可以用一句话概括:

控制端发送 PowerShell/命令 → Windows 执行 → 返回 JSON 结果 → 控制端解析

具体分为几个部分:

  1. 三要素

    • 控制节点(Linux 上的 Ansible)
    • 被管理节点(Windows,不需要安装 Ansible)
    • 通信协议(WinRM,默认端口 5985/5986)
  2. 连接与认证

    • 控制端通过 pywinrm 库和 Windows WinRM 服务通信
    • 常见认证:basic、NTLM、Kerberos
    • 内网环境可以用 basic+HTTP,生产推荐 Kerberos/HTTPS
  3. 模块执行流程

    • 控制端选择目标主机
    • 建立 WinRM 会话
    • 传输 PowerShell 模块/命令到 Windows
    • Windows 执行并产出 JSON 结果
    • 结果返回控制端解析
  4. 文件与脚本管理

    • win_copy:复制文件
    • win_command / win_shell:执行 bat/命令
    • win_powershell:执行 PowerShell 脚本
  5. 幂等性

    • 尽量使用模块(如 win_featurewin_package),而不是裸命令
    • 自写脚本需处理“检查-执行”逻辑
  6. 权限

    • 通常用管理员账号或 become_method: runas
  7. 离线环境

    • Windows 开启 WinRM 不需要联网
    • 控制端 Linux 如需安装 pywinrm,可提前下载 wheel 包离线安装

二、Ansible 版本要求

如果版本过旧,可以通过 pip install --upgrade ansible 升级(离线环境提前下载好包)。


三、环境部署

这里给一个完整的部署流程。

Ansible 部署(Docker)

所以下面使用 Python 镜像进行 Ansible 部署。

Ansible 容器镜像

docker pull python:3.9.23-trixie

拉取 python:3.9.23-trixie 容器镜像

编写 Dockerfile 并构建镜像

vim Dockerfile
FROM python:3.9.23-trixie
ARG http_proxy="http://IP:PORT"
ARG https_proxy="http://IP:PORT"  # 代理,用不上可以不加
RUN apt update && apt install -y sshpass git
RUN pip install ansible pywinrm
docker build -t python:3.9.23-trixie-ansible .

测试

docker run --rm python:3.9.23-trixie /bin/bash -c "ansible --version && ansible-doc -l | grep win"

显示 Ansible 版本号和 win 支持模块即容器镜像完成构建。

启动 Ansible

docker run -it --name ansible -v /root/ansible/ansible:/etc/ansible python:3.9.23-trixie /bin/bash

把本地 /root/ansible/ansible 目录映射到容器的 /etc/ansible 目录
不用 -p 映射端口出来,Ansible 能访问 Win 节点端口就行,Win 节点不用访问 Ansible。

三、Windows 节点配置

为方便测试,后续连接 Wiundows 均使用以下账号密码:

  • 账号:lian
  • 密码:lian

且 Windows 的 IP 为 192.168.62.148

开启 WinRM

但官方不建议使用这个脚本(安全问题),建议最好自己敲 PowerShell 命令去开启服务,如果非要用的话建议删除并只保留自己需要的命令。

感兴趣的可以试一下上面 ps1 脚本,开启 WinRM 总共就两条命令,这里我就手敲执行好了。

管理员 PowerShell 执行:

# 启用 WinRM(管理员)
winrm quickconfig -q
# 允许 Basic 认证 & 明文传输(建议仅限内网/测试用)
winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
# 执行这一句的时候会要求网络类型改为‘域’或‘专用’(默认‘公共’)
# 在‘网络设置’→‘以太网’→‘网络’→点击勾选‘专用’,再执行命令即可生效
# 放行防火墙
New-NetFirewallRule -Name "WinRM" -DisplayName "WinRM" -Protocol TCP -LocalPort 5985 -Action Allow
# 授权用户可通过 WinRM 远程执行命令(Remote Management Users 是 Windows 用户组)
net localgroup "Remote Management Users" ansible /add
# 检查监听器
winrm e winrm/config/listener

四、配置 Ansible Inventory

在 Ansible 的 /etc/ansible/hosts 内写入:

[windows]
192.168.62.148
[windows:vars]
ansible_user=lian
ansible_password=lian
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_port=5985

⚠ 注意:如果用 Docker 容器跑的 Ansible,192.168.62.148 必须能从宿主机/容器访问。


五、测试连通性

在 Ansible 容器里执行:

ansible windows -m win_ping

成功输出:

win01 | SUCCESS => {
"changed": false,
"ping": "pong"
}

六、执行脚本示例

把 Windows 上的脚本都放到 Ansible 控制端,然后在执行时传输到 Windows 节点再运行,这样 更好管理 脚本。

先准备个测试用的 BAT 批处理脚本(test.bat):

@echo off
chcp 65001 >nul
echo ================================
echo 当前路径信息
echo ================================
echo 当前路径是:%cd%
echo.
echo 当前目录下的文件和文件夹:
dir
echo.
echo ================================
echo 当前时间和时区信息
echo ================================
echo 当前日期和时间:%date% %time%
echo.
echo 当前时区:
where tzutil >nul 2>&1 && tzutil /g
echo.
pause

PowerShell 脚本(test.ps1):

# 获取当前时间
$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# 获取计算机名
$computer = $env:COMPUTERNAME
# 获取当前用户名
$user = $env:USERNAME
# 输出结果
Write-Output "当前时间: $time"
Write-Output "计算机名: $computer"
Write-Output "当前用户名: $user"

这两个脚本都放到 Ansible/etc/ansible/file 目录下。

在 Ansible 上调用 Windows bat 脚本,有三种解决方法:

方法 1:win_copy + 执行

先把脚本从控制节点复制到 Windows,再执行。

vim test1.yml
- name: Run scripts on Windows
hosts: windows
tasks:
- name: Copy bat file to Windows
ansible.windows.win_copy:
src: /etc/ansible/file/test.bat
dest: C:\Users\lian\Desktop\script\test.bat
- name: Run bat file
ansible.windows.win_command: C:\Users\lian\Desktop\script\test.bat
- name: Copy ps1 script to Windows
ansible.windows.win_copy:
src: /etc/ansible/file/test.ps1
dest: C:\Users\lian\Desktop\script\test.ps1
- name: Run ps1 file
ansible.windows.win_powershell:
script: |
& "C:\Users\lian\Desktop\script\test.ps1"
ansible-playbook test1.yml

这样 Windows 脚本统一放在 Ansible 项目里(比如 /etc/ansible/file/ 目录),方便版本管理。

如果要打印脚本输出的,playbook 脚本改为如下:

- name: Run scripts on Windows
hosts: windows
tasks:
- name: Copy bat file to Windows
ansible.windows.win_copy:
src: /etc/ansible/file/test.bat
dest: C:\Users\lian\Desktop\script\test.bat
- name: Run bat file and show output
ansible.windows.win_command: C:\Users\lian\Desktop\script\test.bat
register: bat_result
- name: Display bat output
debug:
var: bat_result.stdout_lines
- name: Copy ps1 script to Windows
ansible.windows.win_copy:
src: /etc/ansible/file/test.ps1
dest: C:\Users\lian\Desktop\script\test.ps1
- name: Run ps1 file and show output
ansible.windows.win_shell: powershell.exe -ExecutionPolicy Bypass -File C:\Users\lian\Desktop\script\test.ps1
register: ps1_result
- name: Display ps1 output
debug:
var: ps1_result.stdout_lines

另外会发现,Windows 执行这些脚本只有返回到 Ansilble 只有执行和打印输出信息如果脚本本身就有问题,Ansible 执行过程是不会中断、也不会有脚本以外的报错等信息
这样可以结合输出,追加脚本打印输出,跟据 Windows 执行脚本时返回的信息,判断输出结果符不符合预期(如:Success),符合的话就是正确执行。

方法 2:直接传脚本内容(小脚本用)

如果脚本不大,可以直接嵌到 Playbook,用 win_powershell / win_shellinline script 方式:

- name: Run scripts on Windows (inline)
hosts: windows
tasks:
- name: Run bat inline
ansible.windows.win_shell: |
if not exist "C:\Users\lian\Desktop\script\test2.bat" echo. > "C:\Users\lian\Desktop\script\test2.bat"
echo echo Hello from BAT > "C:\Users\lian\Desktop\script\test2.bat"
"C:\Users\lian\Desktop\script\test2.bat"
- name: Run ps1 inline
ansible.windows.win_powershell:
script: |
Write-Output "Hello from PowerShell"

缺点:脚本内容写在 YAML 里,不好维护,适合临时命令。

方法 3:Ansible roles + 模板化(更适合大规模)

方法 1 差不多。

把 bat/ps1 脚本放到 /etc/ansible/file/目录下,用 win_copy 统一分发并执行,方便团队协作和版本控制。

vim test3.yml
- name: Copy and run BAT
hosts: windows
tasks:
- block:
- name: Copy BAT file
win_copy:
src: /etc/ansible/file/test.bat
dest: C:\Users\lian\Desktop\script\test.bat
- name: Run BAT file
win_command: C:\Users\lian\Desktop\script\test.bat
tags:
- bat
- name: Copy and run PS1
hosts: windows
tasks:
- block:
- name: Copy PS1 file
win_copy:
src: /etc/ansible/file/test.ps1
dest: C:\Users\lian\Desktop\script\test.ps1
- name: Run PS1 file
win_powershell:
script: C:\Users\lian\Desktop\script\test.ps1
tags:
- ps1

执行:

ansible-playbook -i windows test3.yml -t bat

注意事项

测试过程中,发现 Windows LTSC 版阉 割太多,好多事情都做不了,一个简单的 CMD、简单的 bat 脚本,都会把变量里的内容打印并识别成执行语句。

Ansible 里的 win_xx 等命令就更不用说了,Windows LTSC 上很多依赖调用不了,执行会报错。

当然,用 Windows Home 版 作为 Ansbile 节点也不行,因为它无法开启 WinRM 服务。
所以实际上,只能用 Server 版专业/企业版 作为 Ansible 节点。

好在我实际使用场景都是 Window Server 版,所以不用担心功能严格问题。


总结

  1. Ansible 控制端(Docker 内)通过 Python 的 pywinrm 库发送 WinRM 请求。
  2. Windows 节点 WinRM 服务接收请求 → 验证用户身份 → 调用 PowerShell 引擎执行命令。
  3. 返回结果 通过 WinRM 协议传回 Ansible。
  4. Ansible 汇总输出,显示在控制端。

虽说 Windows 的 bat/ps1 脚本也可以存放到 Windows 节点上,但不好管理。

Windows 的脚本都放到 Ansible 上,并且 Playbook 也在 Ansible 上,再加上 Git 仓库,这样便于对整套 Playbook 和 Windows 脚本进行版本管理。可实现,一个平台(Ansible)上就可以完成脚本编写 + 下发了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软工

这个作业属于哪个课程 <班级的链接>这个作业的目标 <你理解的作业目标具体内容>姓名-学号 <你的姓名>-<你的学号>

帮做装修设计的网站建设工程消防备案凭证网站

【工具使用】adb下载和配置 一&#xff0c;简介二&#xff0c;操作步骤2.1 Bing搜索adb2.2 下载adb工具2.3 添加路径到环境变量 三&#xff0c;效果验证 一&#xff0c;简介 本文主要介绍如何下载adb并安装使用&#xff0c;供参考。 此时打开cmd&#xff0c;输入adb 会提示&am…

湖北可以做网站的公司淄博网站外包

!! http://www.shoudian.org/thread-316111-1-1.html http://www.jiequer.com/html/news/xinpin/2014/1218/223.html http://bbs.mydigit.cn/read.php?tid930053转载于:https://www.cnblogs.com/carl2380/p/5239022.html

简单个人博客模板网站wordpress 36氪主题

物理引擎概念解释 所谓物理引擎,就是通过代码模拟物理世界。举个简单例子,比如你初高中都学过物理学,其中力、速度、加速度、位移都是比较常见的物理量,咱们通过CannonJS等物理引擎,都可以辅助你计算生活中物体的速度、位移,比如计算一个小球在地球重力的作用下,下落的…

滕州网站建设 助企网络集团门户网站建设方案 php

OK&#xff0c;那么上篇博客我们介绍了如何搭建基于Javaselenium的环境&#xff0c;并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例&#xff0c;那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法&#xff0c;感谢关注&#xff0c;期待三连~ 目…

10.1考试T4(swap)题解

题目描述 \(link\) 小 D 正在研究交换。 小 D 认为一个整数序列是好的,当且仅当它先(不严格)上升,后(不严格)下降。 形式化地,我们认为序列 \(𝑎_1,𝑎_2,...,𝑎_𝑛\) 是好的,当且仅当存在某个 \(𝑘∈…

如何在windows10的子系统(wsl)中安装php开发环境 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

学校网站建设经验介绍网络营销策划名词解释

Hi~ 大家好久不见呀&#xff01; 一直忙&#xff0c;但不知道在忙啥&#xff0c;好多事情都落下了&#xff0c;ERP的文章最近也没有时间更新&#xff0c;接下去我还在考虑弄个直播&#xff0c;不知道大家有没有什么想了解的&#xff0c;大家给我留言&#xff0c;直播的时候给…

抚顺网站开发3g微网站

当从键盘连续进行输入时用while&#xff0c;但是程序自己不会通过正常的输入结束。 scanf("%d%d",&a, &b); 如果a和b都被成功读入&#xff0c;scanf()的返回值是2 如果只有a被成功读入或者只有b被成功读入&#xff0c;scanf()的返回值为1 如果a和b都未被…

福州高端网站建设服务网络公司建设银行软件官方网站

目录 56. 合并区间 方法1&#xff1a;fff 看方法2&#xff1a;fff优化版 方法3&#xff1a; 738.单调递增的数字 968.监控二叉树&#xff08;贪心二叉树&#xff09; 56. 合并区间 判断重叠区间问题&#xff0c;与452和435是一个套路 方法1&#xff1a;fff 看方法2&am…

20251001 之所思 - 人生如梦

20251001 之所思 今年的生日恰好遇到了国庆,猛然间发现这也是自己最后以三开头的生日了;明年的今天就40岁了,有点恍惚,感觉最近的五年过的太快了,仿佛被偷走了一样 ...今天起的很早,希望自己接下来的一年都能早起…

app界面设计欣赏网站无锡高端网站设计制作

0. 简介 关于车辆的全景环视系统网上已经有很多的资料&#xff0c;然而几乎没有可供参考的代码&#xff0c;这一点对入门的新人来说非常不友好。全景环视系统&#xff0c;又称AVM。在自动驾驶领域&#xff0c;AVM属于自动泊车系统的一部分&#xff0c;是一种实用性极高、可大幅…

湘潭网站建设开发163企业邮箱服务器怎么设置

在产品的设计及生产过程中&#xff0c;经常会出现设计变更、工艺变更、制程调整、非计划停线及转产、转线等“变化”。 如何确保这些“变化”不影响产品后续的生产品质&#xff1f;这就需要在作业准备验证、停产后验证阶段&#xff0c;进行不能缺少的重要环节——“首件检验”。…

平面设计工作室网站专业的网页设计和网站建设公司

web压力测试工具webbench介绍 webbench最多可以模拟3万个并发连接去测试网站的负载能力&#xff0c;并发能力比较高&#xff0c;可以测试https及动态静态页面。 核心原理 父进程fork若干个子进程&#xff0c;每个子进程在用户要求时间或默认的时间内对目标web循环发出实际访问…

优必选 —— 人形机器人 —— 二次开发

优必选 —— 人形机器人 —— 二次开发本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。…

dns看国外网站建立免费个人网站

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 >出处&#xff1a; >https://www.fangzhipeng.com > 本文出自[方志朋的博客](http://blog.csdn.net/forezp) 本文为转载文章&…

GNS3环境下静态路由配置实例与分析(管理距离、度量值) - 教程

GNS3环境下静态路由配置实例与分析(管理距离、度量值) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

网站积分的作用京东app官网下载

目录 写在开头1. 电商平台流量概览1.1 流量来源的分类1.2 各流量来源的特性与价值 2. 流量来源的数据分析方法2.1 流量数据收集与整理2.2 流量质量评估指标2.3 流量转化路径分析 3. 流量来源优化策略3.1 提升自然搜索流量的SEO策略关键词优化内容优化技术优化示例&#xff1a;在…

ppt做杂志模板下载网站有哪些如何使用阿里云服务器建设网站

一、背景 应用持续访问又大又热的key&#xff0c;会造成Redis实例CPU高、流量被打满、数据在内存积压&#xff0c;甚至导致实例达到配额限制被oom-kill。在异步调用、pipeline、mget等批量调用场景比较常见。 大key分为两种情况 集合元素多且全量获取集合数据&#xff1a;命…

两级页表

单级页表存在什么问题,如何解决 问题一:页表必须连续存放,因此当页表很大时,需要占用更多个连续的页框 解决方法:为离散分配的页表再建立一张页表,称为页目录表(套娃) 问题二:进程在一段时间内只需要访问几个…