首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lineinfile ansible模块跳过一行

lineinfile ansible模块跳过一行
EN

Stack Overflow用户
提问于 2017-04-28 23:29:38
回答 2查看 544关注 0票数 0

我需要知道清单中主机名的索引。我正在使用下面的代码创建一个变量文件,以便在后续的实战手册中使用

代码语言:javascript
复制
- 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 }}"'

我有以下清单文件

代码语言:javascript
复制
[hosts]
my.host1.com
my.host2.com

现在,当我运行这段代码时,在/tmp下生成的test.conf有时会有两个主机名,如下所示

代码语言:javascript
复制
host1= my.host2.com
host0= my.host1.com

当我多次运行相同的剧本时,每次都在运行之前清空test.conf。很多时候,文件只有一个条目

代码语言:javascript
复制
host1= my.host2.com

代码语言:javascript
复制
host0= my.host1.com

为什么同样的ansible剧本表现不同?

EN

回答 2

Stack Overflow用户

发布于 2017-04-29 05:18:43

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

尝试使用序列关键字:

代码语言:javascript
复制
- 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 }}"'

编辑:如果只是试图对本地主机上的清单中的主机列表进行操作,一种更好的方法是避免在主机上执行该操作,并首先使用local_action。

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

这会让你得到你想要的结果。然后,您可以添加另一个play来对主机本身执行操作。

票数 0
EN

Stack Overflow用户

发布于 2019-07-25 21:37:33

我的解决方案是用非线程安全的Local_action: lineinfile将收集的数据写入本地文件来避免竞争条件的问题。在同一个文件中将其分成两个不同的播放。

例如:

代码语言:javascript
复制
- 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43683862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档