You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从远程Windows服务器获取时间并在Ansible控制节点任务中使用

解决Ansible获取Windows服务器时间的问题

报错原因

ansible_date_time 是Ansible通过**系统事实收集(gather facts)**生成的变量,出现"不存在该属性"的报错,通常是以下两种情况:

  • 未在Play中启用事实收集(默认启用,但可能被手动关闭)
  • 未针对目标Windows主机执行过事实收集操作

解决方案

方法一:通过系统事实收集获取时间

确保Play启用事实收集,直接调用Windows主机的ansible_date_time变量:

- name: 获取Windows服务器时间并生成文件名
  hosts: 10.14.2.130
  gather_facts: yes  # 显式开启事实收集,确保获取到时间变量
  tasks:
    - name: 生成带时间戳的文件名
      set_fact:
        target_file: "data_{{ ansible_date_time.iso8601_basic_short }}.log"
    - name: 验证文件名
      debug:
        msg: "生成的文件名:{{ target_file }}"

如果需要在控制节点(或其他主机)使用该Windows主机的时间,可通过delegate_to主动收集目标主机的事实:

- name: 在控制节点使用Windows服务器的时间
  hosts: localhost
  tasks:
    - name: 收集Windows主机的系统事实
      setup:
        delegate_to: 10.14.2.130
        gather_subset: all  # 指定收集所有事实(可按需缩小范围)
    - name: 生成文件名
      set_fact:
        target_file: "backup_{{ hostvars['10.14.2.130'].ansible_date_time.year }}{{ hostvars['10.14.2.130'].ansible_date_time.month }}{{ hostvars['10.14.2.130'].ansible_date_time.day }}.zip"
    - name: 打印结果
      debug:
        msg: "{{ target_file }}"

方法二:通过PowerShell直接获取并格式化时间

如果不想依赖系统事实收集,可直接执行Windows的PowerShell命令获取自定义格式的时间:

- name: 用PowerShell获取Windows时间
  hosts: 10.14.2.130
  tasks:
    - name: 获取格式化后的时间戳
      win_shell: Get-Date -Format "yyyyMMddHHmmss"
      register: win_time_result
    - name: 生成文件名
      set_fact:
        target_file: "archive_{{ win_time_result.stdout }}.tar.gz"
    - name: 输出文件名
      debug:
        msg: "{{ target_file }}"

注:Get-Date支持多种格式参数,比如"yyyy-MM-dd HH:mm:ss"可生成带分隔符的时间字符串,按需调整即可。

内容的提问来源于stack exchange,提问作者Blitzden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:18:28