我需要知道清单中主机名的索引。我正在使用以下代码创建一个可以在后续剧本中使用的变量文件
- 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表现得与众不同?
答案 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