未将控制节点纳入hosts时如何获取其时间日期?
Ansible 控制节点时间获取与时间戳文件夹落地方案
一、控制节点时间获取的替代方案(除ansible_date_time外)
考虑到你不想将控制节点纳入hosts以避免被补丁或重启,除了ansible_date_time,有两种可靠方式获取控制节点系统时间:
- 变量定义阶段直接获取
在playbook的vars段通过pipelookup直接生成时间戳变量,该变量会在playbook解析时执行,获取控制节点当前时间:vars: mydate: "{{ lookup('ansible.builtin.pipe', 'date +%Y-%m-%d_%H-%M-%S') }}" tasks: # 后续任务可直接引用{{ mydate }} - 任务执行阶段注册变量
如果需要精准获取任务启动时的时间(比如playbook运行周期长),可以通过debug任务配合注册变量,同时设置run_once: true确保仅执行一次:tasks: - name: 获取控制节点时间戳 debug: msg: "{{ lookup('ansible.builtin.pipe', 'date +%Y-%m-%d_%H-%M-%S') }}" run_once: true delegate_to: localhost register: time_reg
二、提前创建时间戳命名的文件夹
无论用哪种方式获取时间戳,都可以通过file模块在控制节点创建目标文件夹,需指定delegate_to: localhost和run_once: true确保仅在控制节点执行一次:
方案1:基于预定义变量创建
vars: mydate: "{{ lookup('ansible.builtin.pipe', 'date +%Y-%m-%d_%H-%M-%S') }}" tasks: - name: 创建时间戳存储文件夹 ansible.builtin.file: path: "/your/local/path/{{ mydate }}" state: directory mode: '0755' delegate_to: localhost run_once: true # 此任务需放在补丁任务之前执行 - name: 执行补丁任务并导出输出 # 补丁任务逻辑,将输出写入上述时间戳文件夹
方案2:基于注册变量创建
tasks: - name: 获取控制节点时间戳 debug: msg: "{{ lookup('ansible.builtin.pipe', 'date +%Y-%m-%d_%H-%M-%S') }}" run_once: true delegate_to: localhost register: time_reg - name: 创建时间戳存储文件夹 ansible.builtin.file: path: "/your/local/path/{{ time_reg.msg }}" state: directory mode: '0755' delegate_to: localhost run_once: true - name: 执行补丁任务并导出输出 # 补丁任务逻辑,输出路径使用{{ time_reg.msg }}拼接
三、提取注册变量中的纯时间戳
你提到注册变量包含冗余内容,这是因为debug模块注册的变量会附带changed、failed等元数据。纯时间戳字符串存储在time_reg.msg字段中,直接通过{{ time_reg.msg }}即可提取,用于文件夹命名或其他场景。
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

