循环比较 Ansible 中 vars 文件中的变量,如果文件中的当前行与变量不同,则替换行

问题描述 投票:0回答:1

我是 Ansible 的新手,并在这个论坛上发帖,所以请耐心等待!

我试图迭代文件(test_file)中的所有行并比较我放入 vars_file(test.yml)中的变量中的行,如果该行的正则表达式与 test.yml 中的变量匹配,请检查变量属性“值”匹配。我不确定我是否正确解释了这一点。这是我试图描述的文件:

测试.yml

complexity:
 - { name: 'min_value', expression: '=', value: '10' }
 - { name: 'max_value', expression: '=', value: '100' }

测试文件

min_value = **some random number**
max_value = **some random number**

例如,如果 test_file 中的 min_value 是 2000,但我希望它是 10,那么它将仅替换我猜测的最后一个行属性。我希望它能够迭代变量文件中 complexity 循环中的所有项目,并进行必要的更改。

这是我尝试过的:

文件/test.yml

complexity:
 - { name: 'min_value', expression: '=', value: '10' }
 - { name: 'max_value', expression: '=', value: '100' }
test_file: /etc/test/test.conf
file_lines: "{{ lookup('file', '/etc/test/test.conf/').splitlines() }}"

main.yml

 - hosts: localhost
   vars_files: files/test.yml

   tasks:

   - name: Replace line if variables do not match
     lineinfile:
       path: "{{ test_file }}"
       regexp: "{{ item.name }} {{ item.expression }}"
       state: present
       line: "{{ item.name }} {{ item.expression }} {{ item.value }}"
     with_items:
      - "{{ complexity }}"
      - "{{ file_lines }}"
     when: "{{ file_lines }} != {{ item.name }} {{ item.expression }} {{ item.value }}"

我还尝试过 with_nested 以及 with_nested 的更新方法,使用循环:

loop: "{{ complexity }} | zip(file_lines) | list }}"
loops variables ansible
1个回答
0
投票

给定文件

shell> cat /tmp/test_file 
min_value = **some random number**
max_value = **some random number**

以下播放

shell> cat pb.yml
- hosts: localhost

  vars:

    complexity:
      - {name: min_value, expression: '=', value: 10}
      - {name: max_value, expression: '=', value: 100}

  tasks:

    - lineinfile:
        path: /tmp/test_file
        regexp: '^\s*{{ item.name }}\s*{{ item.expression }}\s*(.*)$'
        line: "{{ item.name }} {{ item.expression }} {{ item.value }}"
      loop: "{{ complexity }}"

给出删节(使用 --check --diff 选项运行)

shell> ansible-playbook pb.yml -CD
  ...
TASK [lineinfile] ****************************************************************************
--- before: /tmp/test_file (content)
+++ after: /tmp/test_file (content)
@@ -1,2 +1,2 @@
-min_value = **some random number**
+min_value = 10
 max_value = **some random number**

changed: [localhost] => (item={'name': 'min_value', 'expression': '=', 'value': 10})
--- before: /tmp/test_file (content)
+++ after: /tmp/test_file (content)
@@ -1,2 +1,2 @@
 min_value = **some random number**
-max_value = **some random number**
+max_value = 100

changed: [localhost] => (item={'name': 'max_value', 'expression': '=', 'value': 100})

播放会修改文件

shell> ansible-playbook pb.yml
  ...
TASK [lineinfile] ****************************************************************************
changed: [localhost] => (item={'name': 'min_value', 'expression': '=', 'value': 10})
changed: [localhost] => (item={'name': 'max_value', 'expression': '=', 'value': 100})
shell> cat /tmp/test_file 
min_value = 10
max_value = 100

该剧是幂等的。重复后没有任何变化

shell> ansible-playbook pb.yml
  ...
TASK [lineinfile] ****************************************************************************
ok: [localhost] => (item={'name': 'min_value', 'expression': '=', 'value': 10})
ok: [localhost] => (item={'name': 'max_value', 'expression': '=', 'value': 100})
© www.soinside.com 2019 - 2024. All rights reserved.