使用Ansible在特定数量的配置行之后添加行

使用Ansible在特定数量的配置行之后添加行,ansible,ansible-2.x,Ansible,Ansible 2.x,我试图在我的karaf配置文件中添加一行,下面是配置代码段 wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/*.jar wrapper.java.classpath.2=%KARAF_BASE%/lib/wrapper/*.jar wrapper.java.classpath.3=%KARAF_HOME%/system/org/ops4j/pax/logging/pax-logging-api/*/pax-logging-api-*.jar 现在我

我试图在我的karaf配置文件中添加一行,下面是配置代码段

wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/*.jar
wrapper.java.classpath.2=%KARAF_BASE%/lib/wrapper/*.jar
wrapper.java.classpath.3=%KARAF_HOME%/system/org/ops4j/pax/logging/pax-logging-api/*/pax-logging-api-*.jar
现在我想让ansible脚本计算所有wrapper.java.classpath.*并在上面类似的内容后面插入新的两行

wrapper.java.classpath.4=%KARAF_HOME%/system/my*.jar
wrapper.java.classpath.5=%KARAF_HOME%/system/my2*.jar
记住这一点,下一个条目不一定是wrapper.java.classpath.4计数可能会根据安装情况而改变

我正在查看lineinfle,但它无法使用regexp收集计数

 - name: Adding classpath entries for my jar
      lineinfile: 
       dest: $KARAF_HOME/etc/wrapper.conf
       regexp: 'wrapper\.java\.classpath\.*' 
       line: 'wrapper.java.classpath.4=%KARAF_HOME%/system/my*.jar'
       backrefs: yes
目前在shell脚本中,我做的如下操作

NUM_CLASSPATH_ENTRIES=$(less ${WRAPPER_CONF_FILE} | grep wrapper\.java\.classpath | wc -l)

KARAF_MY_ENTRY="wrapper.java.classpath.$((NUM_CLASSPATH_ENTRIES+1))=%KARAF_BASE%/lib/my*.jar"
sed -i "/wrapper\.java\.classpath\.$NUM_CLASSPATH_ENTRIES.*/a $KARAF_MY_ENTRY" ${WRAPPER_CONF_FILE}

您可以使用这个剧本来计算wrapper.java.classpath条目的行数,然后在最后一行后面追加您需要的另外两个条目

剧本:

  tasks:
    - name: cat file
      shell: cat testt.txt | grep '^wrapper.java.classpath'
      register: file_grep

    - name: find max number
      set_fact:
        max_number: "{{ max_number|default(0)|int + 1|int }}"
      loop: "{{ file_grep.stdout_lines }}"

    - name: Adding classpath entries for my jar
      blockinfile: 
        dest: testt.txt
        block: |
          wrapper.java.classpath.{{ max_number|int + 1|int }}=%KARAF_HOME%/system/my*.jar
          wrapper.java.classpath.{{ max_number|int + 2|int }}=%KARAF_HOME%/system/my2*.jar
        insertafter: "^(wrapper.java.classpath)(.+)$"
        backup: yes
我的测试中的示例配置文件testt.txt:

wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/*.jar
wrapper.java.classpath.2=%KARAF_BASE%/lib/wrapper/*.jar
wrapper.java.classpath.3=%KARAF_HOME%/system/org/ops4j/pax/logging/pax-logging-api/*/pax-logging-api-*.jar
wrapper.java.classpath.4=%KARAF_BASE%/lib/boot/*.jar
wrapper.java.classpath.5=%KARAF_BASE%/lib/wrapper/*.jar
random config line 1
more random config line 1
and one last random line
运行和结果:

[root@optima-ansible ILIAS]# ansible-playbook testt.yml 

PLAY [localhost] ****************************************************************************************************************************************************************************************************

TASK [cat file] *****************************************************************************************************************************************************************************************************
changed: [localhost]

TASK [find max number] **********************************************************************************************************************************************************************************************
ok: [localhost] => (item=wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/*.jar)
ok: [localhost] => (item=wrapper.java.classpath.2=%KARAF_BASE%/lib/wrapper/*.jar)
ok: [localhost] => (item=wrapper.java.classpath.3=%KARAF_HOME%/system/org/ops4j/pax/logging/pax-logging-api/*/pax-logging-api-*.jar)
ok: [localhost] => (item=wrapper.java.classpath.4=%KARAF_BASE%/lib/boot/*.jar)
ok: [localhost] => (item=wrapper.java.classpath.5=%KARAF_BASE%/lib/wrapper/*.jar)

TASK [Adding classpath entries for my jar] **************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP **********************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0   

[root@optima-ansible ILIAS]# cat testt.txt
wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/*.jar
wrapper.java.classpath.2=%KARAF_BASE%/lib/wrapper/*.jar
wrapper.java.classpath.3=%KARAF_HOME%/system/org/ops4j/pax/logging/pax-logging-api/*/pax-logging-api-*.jar
wrapper.java.classpath.4=%KARAF_BASE%/lib/boot/*.jar
wrapper.java.classpath.5=%KARAF_BASE%/lib/wrapper/*.jar
# BEGIN ANSIBLE MANAGED BLOCK
wrapper.java.classpath.6=%KARAF_HOME%/system/my*.jar
wrapper.java.classpath.7=%KARAF_HOME%/system/my2*.jar
# END ANSIBLE MANAGED BLOCK
random config line 1
more random config line 1
and one last random line[root@optima-ansible ILIAS]# 
我们正在进行grepping以找到以wrapper.java.classpath开头的行,对它们进行计数,然后在动态地将索引号增加到接下来的2个值之后,在这2行后面追加inserta

请查看blockinfile模块文档,以根据您的需要配置BEGIN ANSIBLE托管块线


希望能有帮助

① 使用模板;② 编写一个自定义模块。看起来您接受了@ilias sp answer,所以这只是一个问题,但您是否放弃了使用模板来更新文件的想法?我对提供的解决方案最大的担忧是,如果有人/某事更新了文件并破坏了您期望的playbook格式,则可能会生成无效文件。@dan_linder我目前正在重构现有的shell脚本,并正在学习ansible。我们一定会调查的。其次是它的标准karaf配置,很有可能不会被更改,我正在运行这个脚本进行首次安装。lineinfle不是你的朋友。如果我们运行cat testt.txt | grep'^wrapper.java.classpath'| wc-l,我们可以得到count,实际上只需执行1个增量,而不是循环,你是对的。我进行了逐行检查,因为我认为我们必须在lineinblock模块的insertafter子句中使用最后一行作为参数,但事实证明insertafter可以是正则表达式,并将其更改为以下实现: