如何在Ansible中编辑现有fact 为磁盘列表项新增递增ID字段
实现方案
你可以直接通过Jinja2循环+set_fact原地更新原有fact的disks字段,不会产生额外的全局fact变量,写法如下:
- name: 为disks数组元素新增id字段 ansible.builtin.set_fact: disks: "{{ _tmp_disks }}" vars: # 临时变量仅在当前task生效,不会成为独立fact _tmp_disks: >- {% set result = [] %} {% for disk in disks %} {{ result.append(disk | combine({'id': "id%03d" | format(loop.index)})) }} {% endfor %} {{ result }}
逻辑说明
- 利用Jinja2内置的
loop.index计数器,默认从1开始递增,刚好匹配你需要的序号规则 %03d是数字格式化语法,会把1位/2位数字补前导零为3位,生成id001格式的字符串combine过滤器用于合并原有disk字典和新增的id字段,不会覆盖磁盘原有属性- task级vars定义的
_tmp_disks仅在当前task运行时有效,执行结束后自动销毁,符合不新增独立fact的要求
完整测试示例
你可以用下面的playbook直接验证效果:
--- - name: 测试disks字段更新 hosts: localhost gather_facts: false # 模拟你已有的fact结构 vars: fact_one: true fact_two: true disks: - name: /dev/sda - name: /dev/sdb - name: /dev/sdc tasks: - name: 更新disks数组 ansible.builtin.set_fact: disks: "{{ _tmp_disks }}" vars: _tmp_disks: >- {% set result = [] %} {% for disk in disks %} {{ result.append(disk | combine({'id': "id%03d" | format(loop.index)})) }} {% endfor %} {{ result }} - name: 打印更新后的fact ansible.builtin.debug: var: disks
运行后输出的disks结构和你要求的目标完全一致,原有fact_one、fact_two等字段不会被修改。
内容的提问来源于stack exchange,提问作者Fernando Vermelho
相关产品推荐
相关产品推荐

