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

如何让lineinfile/copy模块生成UUID文件的操作实现幂等性?

实现幂等性的两种方案(无需stat模块或block)

方案1:始终保持文件中只有一个最新UUID

利用lineinfile的regexp参数匹配标准UUID格式,每次执行时替换已有UUID行,无则添加,避免重复新增行:

- name: 生成UUID
  set_fact:
    uuid: "{{ 99999 | random | to_uuid }}"

- name: 确保文件仅包含一个UUID
  ansible.builtin.lineinfile:
    dest: /dir/uuid.txt
    line: "{{ uuid }}"
    # 匹配标准UUID格式的行,覆盖所有已存在的UUID
    regexp: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
    state: present
    # 文件不存在时自动创建
    create: yes

执行逻辑

  • 首次执行:文件为空,无匹配行,直接添加生成的UUID。
  • 重复执行:匹配到文件中已有的UUID行,将其替换为本次生成的新UUID,不会新增行,实现幂等。

方案2:仅在文件无UUID时写入一次

如果需要文件中一旦存在UUID就不再修改,可使用replace模块匹配非UUID内容,仅在符合条件时写入:

- name: 生成UUID
  set_fact:
    uuid: "{{ 99999 | random | to_uuid }}"

- name: 仅在文件无UUID时写入
  ansible.builtin.replace:
    dest: /dir/uuid.txt
    # 匹配空文件或不包含标准UUID的内容
    regexp: '^(?!.*[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}).*$'
    replace: "{{ uuid }}"
    # 文件不存在则自动创建
    create: yes

执行逻辑

  • 首次执行:文件为空或无UUID,替换为新生成的UUID。
  • 重复执行:文件中已有UUID,正则表达式匹配失败,不做任何修改,实现幂等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:25:09