Ansible 使用LINEINFLE填写可更换库存文件

Ansible 使用LINEINFLE填写可更换库存文件,ansible,ansible-inventory,Ansible,Ansible Inventory,我有一项琐碎的任务,就是用新部署的虚拟机名称填充特定的ansible清单文件。 这是我的剧本: - hosts: 127.0.0.1 tasks: - name: Add host to inventory file lineinfile: dest: "{{inv_path}}" regexp: '^\[{{role}}\]' insertafter: '^#\[{{role}}\]' line: "{{new_

我有一项琐碎的任务,就是用新部署的虚拟机名称填充特定的ansible清单文件。 这是我的剧本:

- hosts: 127.0.0.1
  tasks:
  - name: Add host to inventory file
    lineinfile: 
        dest: "{{inv_path}}"
        regexp: '^\[{{role}}\]'
        insertafter: '^#\[{{role}}\]'
        line: "{{new_host}}"
ansible将字符串替换为主机名,而不是在[role]之后添加新行。我的目标是在它之后自然插入。如果没有匹配的角色,则应跳过添加新行


如何做到这一点?谢谢

[role]
正在被替换,因为
regexp
参数是Ansible将查找的正则表达式,以替换为
参数。只需将该值移动到
insertafter
,然后去掉
regexp

至于其他需求,您需要另一个任务,首先检查
[role]
是否存在。然后,lineinfile任务将评估checker任务的结果,以确定是否应运行该任务

- name: Check if role is in inventory file
  shell: grep [{{ role }}] {{ inv_path }}
  ignore_errors: True
  register: check_inv

- name: Add host to inventory file
  lineinfile:
    dest: "{{ inv_path }}"
    insertafter: '^\[{{role}}\]$'
    line: "{{new_host}}"
  when: check_inv.rc == 0

你能澄清一下你最后的要求吗?您是说如果在清单中找不到
角色
,您想跳过整个任务吗?也。您可能想看看动态库存-?与其说是一本管理库存的手册,不如说是一本管理库存的手册。我是从vRealize Automation提供VMware虚拟机的。作为整个工作流程的一部分,我需要将配置好的VM添加到静态Ansible库存中,供DevOps团队稍后使用。这就是它的工作原理。在请求过程中,用户应该为VM指定Ansible角色,如果它不在清单列表中,我们将跳过itThanks,@kfreezy以获得您的支持。但我还是不能应付。从我的文件复制:-主机:127.0.0.1任务:-名称:检查角色是否在清单文件shell:grep[{{role}}]{{{inv_path}}忽略}错误:True寄存器:Check_inv-名称:将主机添加到清单文件行infle:dest:{inv_path}插入后面:'^[{{{{role}}]$'行:{{new host}时间:检查_inv.rc==0我找到的内容。首先,我不确定grep检查是否真的有效。如果在库存文件中找不到角色,它将返回许多行。administrator@ansible:~$grep[bla bla]/etc/ansible/ansible_-alameda/inventory/dev/alameda_-all.ini[wsreportbuilder][alameda]T1-shl08.test.localadministrator@ansible:~$Second,它总是将我的主机添加到EOF,而不是在[role]之后。它看起来类似于这个问题:您评估的是来自grep的返回代码,而不是行数。如果找到某个内容,它将返回0,否则它将返回1或2。尝试转义
后面插入的方括号
<代码>插入符:“^\[{{{{role}}\]$”。如果这不起作用,请尝试从正则表达式中删除“$”。在这一行的末尾可能有一个额外的空格。