Ansible多个regexp在状态为

Ansible多个regexp在状态为,ansible,jinja2,Ansible,Jinja2,我试图根据ansible收集的工件替换文件中的名称。 使用ONElineinfle 像这样的, lineinfile: path: '/somefile.conf' regexp: '{{ item.regexp }}' line: '{{ item.line }}' with_items: - { regexp: '^DB_TYPE=', line: "DB_TYPE=mysql" } when: mysql.stat.exists - { rege

我试图根据ansible收集的工件替换文件中的名称。 使用ONE
lineinfle

像这样的,

lineinfile:
    path: '/somefile.conf'
    regexp: '{{ item.regexp }}'
    line: '{{ item.line }}'
  with_items:
    - { regexp: '^DB_TYPE=', line: "DB_TYPE=mysql" } when: mysql.stat.exists
    - { regexp: '^DB_TYPE=', line: "DB_TYPE=oracle" } when: oracle.stat.exists

我相信当条件与一个任务相关联时,
,因此在同一个任务中不同的循环不能有不同的条件(很高兴在这里得到纠正)

这给您留下了两个选择:

  • 将此任务拆分为多个
    lineinfle
    任务,这听起来似乎是您想要避免的
  • 利用模块。不一定更好,但要知道这很酷
  • 第二个选项的示例:

    - name: set database type for mysql deployment
      set_fact:
        _db_type: mysql
      when: mysql.stat.exists
    
    - name: set database type for oracle deployment
      set_fact:
        _db_type: oracle
      when: oracle.stat.exists
    
    - name: something something
      lineinfile:
        path: '/somefile.conf'
        regexp: '^DB_TYPE='
        line: "DB_TYPE={{ _db_type }}"
    

    如果有多个任务需要引用mysql或oracle(例如),我发现这很有用。

    如果。。。其他的如果

      lineinfile:
        path: '/somefile.conf'
        regexp: '^DB_TYPE='
        line: "{{ 'DB_TYPE=mysql' if mysql.stat.exists else 'DB_TYPE=oracle' if oracle.stat.exists }}"
    

    如何在此循环中定义变量。例如,我想输入IP地址,但无法退出循环。这里有一个例子:'LyfIf:Posith:/OfField.CONF'ReExp::iPiAdDr==行:{MyQual.STAT..MyQual.STAT..ObjavyLtSt..ObjyType = {{ANSILUBYALLIPIPv4}地址}‘如果Oracle .Stist.Ent}},“如果您只考虑IP地址列表中的第一个IP,则<代码>行<代码>将是<代码>行:{{'IP_ADDR=127.0.0.1'如果mysql.stat.exists其他IP_ADDR='~ansible'u all_ipv4_地址[0]如果oracle.stat.exists}}“Great-answer@franklinsijo。如何实现相同的结果,但使用混合变量+文本。类似于:lineinfile:path:'/somefile.conf'regexp:'^URL='行:“{'URL=127.0.0.1'如果mysql.stat.exists其他'URL=http://{{ansible\u all\u ipv4\u addresses}}/test'如果oracle.stat.exists}}“这是与上面类似的连接,
    'URL=http://'~ansible\u all\u ipv4\u addresses[0]~'/test'