【问题标题】:Ansible lineinfile module not adding all the required lines to the fileAnsible lineinfile 模块未将所有必需的行添加到文件中
【发布时间】:2022-07-04 19:39:03
【问题描述】:

我在 ansible 中使用 lineinfile 模块将清单中的所有主机附加到文件中。 这是 ansible playbook 代码 -

- hosts: test
  connection: ssh
  gather_facts: no
  tasks:

    - name: Create file to store hosts to be updated
      delegate_to: localhost
      run_once: true
      file:
        path: /tmp/updated_hosts.txt
        state: touch
        mode: u=rw,g=rw,o=rw

    - name: WRITE of updated hosts in play
      delegate_to: localhost
      lineinfile:
        path: /tmp/updated_hosts.txt
        line: "{{ inventory_hostname }},"
      when: some condition

这是我的库存

[test]
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
test11
test12
test13
test14
test15
test16
test17
test18
test19
test20
test21
test22
test23
test24
test25
test26
test27
test28
test29
test30

但是在运行剧本之后

PLAY [test] ***********************************************************************************************************************************************************************************************

TASK [Create file to store hosts to be updated] ***********************************************************************************************************************************************************
changed: [test1 -> localhost]

TASK [WRITE of updated hosts in play] *********************************************************************************************************************************************************************
changed: [test2 -> localhost]
changed: [test1 -> localhost]
changed: [test4 -> localhost]
changed: [test5 -> localhost]
changed: [test3 -> localhost]
changed: [test7 -> localhost]
changed: [test10 -> localhost]
changed: [test6 -> localhost]
changed: [test8 -> localhost]
changed: [test9 -> localhost]
changed: [test11 -> localhost]
changed: [test12 -> localhost]
changed: [test13 -> localhost]
changed: [test14 -> localhost]
changed: [test15 -> localhost]
changed: [test16 -> localhost]
changed: [test18 -> localhost]
changed: [test20 -> localhost]
changed: [test19 -> localhost]
changed: [test17 -> localhost]
changed: [test21 -> localhost]
changed: [test24 -> localhost]
changed: [test22 -> localhost]
changed: [test23 -> localhost]
changed: [test25 -> localhost]
changed: [test26 -> localhost]
changed: [test29 -> localhost]
changed: [test27 -> localhost]
changed: [test28 -> localhost]
changed: [test30 -> localhost]

PLAY RECAP ************************************************************************************************************************************************************************************************
test1                      : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test10                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test11                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test12                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test13                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test14                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test15                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test16                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test17                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test18                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test19                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test2                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test20                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test21                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test22                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test23                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test24                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test25                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test26                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test27                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test28                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test29                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test3                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test30                     : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test4                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test5                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test6                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test7                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test8                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test9                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

当我检查 /tmp/updated_hosts.txt 的内容时,这是我发现的 -

test1,
test5,
test3,
test8,
test9,
test14,
test17,
test22,
test25,
test30,

为什么我看不到所有主机?即使我看到该任务已在所有主机上执行。

附: - 清单 test1、test2 ...中的主机仅用于提问。

编辑 - 我已经编辑了 ansible 代码,只在满足某些条件时才将主机名写入文件

【问题讨论】:

  • 此外,在旅途中更新文件并不是最好的方法。你可以在ansible_play_hostmagic variablemagic variable播放结束时立即获得该列表
  • @Zeitounator 只是为了问我已经格式化了我想要实现的问题。问题是我不希望将每个主机都写入文件,而只希望那些满足我将在 when 语句中放入的条件的主机
  • @ashishpm 然后不要将其放在 when 语句中,并使用 selectattr 过滤 hostvars 字典。您需要向我们解释您真正想要做什么,而不是您当前的尝试,否则您将面临可怕的 XY problem 范式。

标签: ansible


【解决方案1】:

您的问题可能是由多个主机尝试同时更新文件引起的。有可能会漏掉一些行。 尝试使用 with_inventory_hostnames lookup 循环访问主机

    - name: WRITE of updated hosts in play
      delegate_to: localhost
      run_once: true
      lineinfile:
        path: /tmp/updated_hosts.txt
        line: "{{ item }},"
        insertafter: EOF
      with_inventory_hostnames:
        - test

【讨论】:

  • 我已经编辑了问题以将代码更改为仅在满足某些条件时将主机名插入文件
  • 添加insertafter: EOF
【解决方案2】:

尝试以下逻辑,它在我的代码中起作用:

  - name: tracking
    lineinfile:
      path: /path/file_name.txt
      line: "{{inventory_hostname}}"
      state: present
      insertafter: EOF
    register: check
    retries: 1
    until: check is not changed
    when: Some condition 
    delegate_to: localhost
    ignore_errors: yes

【讨论】:

    【解决方案3】:

    我认为,根本问题是,您使用 lineinfile 的任务仅在 localhost 上运行,并且您同时运行 30 个线程来更改单个系统上的单个文件。

    那么当然,一个线程上的lineinfile 模块会覆盖另一个线程中已经写入的数据。因为系统没有验证它的输出,所以你会得到随机的“race-condition-like”输出。您可以通过在剧本中添加“序列号:1”来尝试此操作。

    - hosts: test
      connection: ssh
      gather_facts: no
      serial: 1
      tasks:
        ...
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2016-10-16
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2021-08-14
      相关资源
      最近更新 更多