如何使用ansible过滤器删除空白

时间:2018-05-06 15:50:03

标签: ansible jinja2

我正在编写如下的ansible代码

-
 gather_facts: false
 hosts: localhost # "{{ servername }} "
 remote_user: raahool
 vars:
     BOOK_NAME: "RAHUL             ANIKET                PRAG                     VISHAL          SANDY           BONGO                   MARIO"
 books: "{% for book in BOOK_NAME -%}
            {{ book }}
         {%- endfor %}"

tasks:
-
   name: "something HAPPEN TO MY CODE "
register: ia_feed_delay
shell: |


         echo " SELECT QUERY 3  in {{ books }} "

 -
    debug: var=ia_feed_delay.stdout_lines

我希望输出为

SELECT QUERY 3  in 'RAHUL','ANIKET','PRAG','VISHAL','SANDY','BONGO','MARIO'

我尝试了大多数jinja2过滤器,如地图,列表,加入,但仍然没有运气。

3 个答案:

答案 0 :(得分:0)

不确定为什么要像这样声明BOOK_NAME变量。你可以把它作为列表变量更高效地完成:

  vars:
    BOOK_NAME: 
      - RAHUL
      - ANIKET
      - PRAG
      - VISHAL
      - SANDY
      - BONGO
      - MARIO

以下是如何从此列表中获取您声明要结束的sql字符串:

- hosts: localhost
  gather_facts: false
  vars:
    sql_string: 
    BOOK_NAME: 
      - RAHUL
      - ANIKET
      - PRAG
      - VISHAL
      - SANDY
      - BONGO
      - MARIO
  tasks:
  - name: prepare sql string
    set_fact:
      sql_string: "SELECT QUERY 3  in '{{ \"','\".join(BOOK_NAME)}}'"

  - name: print variable
    debug:
      var: sql_string

输出:

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

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

TASK [prepare sql string] *******************************************************************************************************************************************************************************************
ok: [localhost]

TASK [print variable] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "sql_string": "SELECT QUERY 3  in 'RAHUL','ANIKET','PRAG','VISHAL','SANDY','BONGO','MARIO'"
}

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

[root@optima-ansible ILIAS]# 

答案 1 :(得分:0)

我建议使用here

中的clean插件

代码段是:

# Import modules
import unittest
import re
import unicodedata
import textwrap 

def _string_sanity_check(string):
    if string is None:
        return ''
    if not isinstance(string, basestring):
        return str(string)
    return string

def clean(string):
    sanitzed_string = _string_sanity_check(string)
    return " ".join(sanitzed_string.split())

将其复制到plugin/filters目录并按以下方式使用:

---
  - name: String Test
    gather_facts: False
    hosts: localhost

    vars:
     BOOK_NAME: "RAHUL             ANIKET                PRAG                     VISHAL          SANDY           BONGO                   MARIO"

    tasks:

      - name: debug without filter
        debug:
          var: BOOK_NAME

      - name: debug with filter
        debug:
          var: BOOK_NAME | clean

      - name: Fact
        set_fact:
          new_books: "{{ BOOK_NAME | clean  }}"

      - name: debug split
        debug:
          var: new_books.split(" ")

你会得到:

PLAY [String Test] *************************************************************************************************************************

TASK [debug without filter] ****************************************************************************************************************
ok: [localhost] => {
    "BOOK_NAME": "RAHUL             ANIKET                PRAG                     VISHAL          SANDY           BONGO                   MARIO"
}

TASK [debug with filter] *******************************************************************************************************************
ok: [localhost] => {
    "BOOK_NAME | clean": "RAHUL ANIKET PRAG VISHAL SANDY BONGO MARIO"
}

TASK [Fact] ********************************************************************************************************************************
ok: [localhost]

TASK [debug split] *************************************************************************************************************************
ok: [localhost] => {
    "new_books.split(\" \")": [
        "RAHUL", 
        "ANIKET", 
        "PRAG", 
        "VISHAL", 
        "SANDY", 
        "BONGO", 
        "MARIO"
    ]
}

PLAY RECAP *********************************************************************************************************************************
localhost                  : ok=4    changed=0    unreachable=0    failed=0 

答案 2 :(得分:0)

谢谢大家: - )

下面的脚本解决了我的问题:

---

- name: String Test
  gather_facts: False
  hosts: localhost
  vars:
    BOOK_NAME: RAHUL             ANIKET                PRAG                     VISHAL          SANDY           BONGO                   MARIO
  tasks:
  - name: debug without filter
    shell: |
     echo "SELECT * FROM TABLE_NAME WHERE COLUMN IN ('{{ BOOK_NAME.split()| list | join("', '") }}') ;"
    register: status_book
  -
...

输出:

TASK [debug]************************************************************************************************************************************************
ok: [localhost] => {
"status_book.stdout_lines": [
    "SELECT * FROM TABLE_NAME WHERE COLUMN IN ('RAHUL', 'ANIKET', 'PRAG', 'VISHAL', 'SANDY', 'BONGO', 'MARIO') ;"
]
   }