lineinfile ansible模块跳过一行

时间:2017-04-28 15:29:38

标签: ansible

我需要知道清单中主机名的索引。我正在使用以下代码创建一个可以在后续剧本中使用的变量文件

- name: Debug me
  hosts: hosts
  tasks:
      - debug: msg="{{ inventory_hostname }}"
      - debug: msg="{{ play_hosts.index(inventory_hostname) }}"
      - local_action: 'lineinfile create=yes dest=/tmp/test.conf
                   line="host{{ play_hosts.index(inventory_hostname) }}=
                   {{ inventory_hostname }}"'

我有以下清单文件

[hosts]
my.host1.com
my.host2.com

现在当我运行它时,在/ tmp下生成的test.conf有时会同时拥有这样的主机名

host1= my.host2.com
host0= my.host1.com

当我在运行之前每次运行相同的playbook几次清空test.conf时。相当多次文件只有一个条目

host1= my.host2.com

host0= my.host1.com

同样的ansible playbook表现得与众不同?

2 个答案:

答案 0 :(得分:0)

我认为问题是您针对不同的主机运行两个线程,并且使用local_action不是线程安全的。

尝试使用serial关键字:

- name: Debug me
  hosts: hosts
  serial: 1
  tasks:
      - debug: msg="{{ inventory_hostname }}"
      - debug: msg="{{ play_hosts.index(inventory_hostname) }}"
      - local_action: 'lineinfile create=yes dest=/tmp/test.conf
                   line="host{{ play_hosts.index(inventory_hostname) }}=
                   {{ inventory_hostname }}"'

编辑:如果只是尝试操作localhost上的清单中的主机列表,那么更好的方法就是避免在主机上执行操作并首先使用local_action。

- name: Debug me
  hosts: localhost
  tasks:
  - lineinfile:
      create: yes
      dest: /tmp/test.conf
      line: "host{{ groups['hosts'].index(item)}}={{ item }}"
    with_items: " {{ groups['hosts'] }}"

这将为您提供所需的结果。然后你可以添加另一个游戏来对主机本身进行操作。

答案 1 :(得分:0)

我正在尝试避免使用非线程安全Local_action:lineinfile将收集的数据写入本地文件的竞争条件的问题的解决方案。将其拆分为同一文件中的2个不同剧本。

例如:

- name: gather_date
  hosts: all
  any_errors_fatal: false
  gather_facts: no
  tasks:
    - name: get_Aptus_device_count_list
      shell: gather_data.sh
      become: true
      register: Aptus_device_count_list
      changed_when: false

- name: Log_gathered_date
  hosts: all
  any_errors_fatal: false
  gather_facts: no
  tasks:
    - name: log_gathered_info
      local_action:  
          module: lineinfile
          dest: /home/rms-mit/MyAnsible/record_Device_count_collection.out 
          line: "\n--- {{ inventory_hostname }} --- \n
             {{ Aptus_device_count_list.stdout }} \n.\n---\n"
      changed_when: false