ansible字符串處理(一)


[root@node-1 test]# ansible-playbook hba_card_check.yml 

PLAY [compute[0]] *******************************************************************************************************
Tuesday 12 March 2019  08:50:44 +0800 (0:00:00.097)       0:00:00.097 ********* 

TASK [get hba hosts] ************************************************************************************************************
ok: [172.23.2.9]
Tuesday 12 March 2019  08:50:45 +0800 (0:00:00.425)       0:00:00.522 ********* 

TASK [set_fact] *******************************************************************************************************************
ok: [172.23.2.9]
Tuesday 12 March 2019  08:50:45 +0800 (0:00:00.112)       0:00:00.635 ********* 

TASK [debug] *********************************************************************************************************************
ok: [172.23.2.9] => {
    "hba_hosts.stdout_lines": [
        "/sys/class/fc_host/host11", 
        "/sys/class/fc_host/host12"
    ]
}
Tuesday 12 March 2019  08:50:45 +0800 (0:00:00.120)       0:00:00.756 ********* 

TASK [get hba card state] *********************************************************************************************************
changed: [172.23.2.9]
Tuesday 12 March 2019  08:50:45 +0800 (0:00:00.307)       0:00:01.064 ********* 

TASK [debug] ***********************************************************************************************************************
ok: [172.23.2.9] => {
    "port_state.stdout_lines": [
        "[u'', u'sys', u'class', u'fc_host', u'host11'] Online", 
        "[u'', u'sys', u'class', u'fc_host', u'host12'] Online"
    ]
}

PLAY RECAP ************************************************************************************************************************
172.23.2.9                 : ok=5    changed=1    unreachable=0    failed=0   

上邊是完整的輸出。
代碼如下:

---
- hosts: compute[0]
  gather_facts: false
  tasks:
  - name: get hba hosts
    shell: ls -d /sys/class/fc_host/host*
    register: hba_hosts
    failed_when: false
    changed_when: false
  - set_fact:
        hba_count: "{{hba_hosts.stdout_lines|length}}"
    when: hba_hosts.rc == 0
  - name: get hba card state
    shell: |-
        {%- for host in hba_hosts.stdout_lines -%}
            echo -n "{{ host.split('/') }} "
            cat {{ host }}/port_state;
        {%- endfor -%}
    register: port_state
  - debug: var=port_state.stdout_lines

那么字符傳的輸出處理在get hba cart state這個task的shell里, 使用了jinja2循環,在echo時,對元素host進行路徑字符串(hba_hosts.stdout_lines的元素)分割,想得到路徑最右的‘/’后的文件夾名稱,也就是shell的basename,然而在playbook中,jinja2獲取的變量是utf-8編碼,而python2.7和shell都是ascii編碼,所以此時要得到沒有u‘’的字符串需要對這個元素host進行編碼,使用.encode()方法(python2默認編碼ascii),則可以去掉u'',得到我們想要的結果.
echo -n "{{ host.encode().split('/') }} "
輸出即為如下:


TASK [debug] *******************************************************************************************************************
ok: [172.23.2.9] => {
    "port_state.stdout_lines": [
        "['', 'sys', 'class', 'fc_host', 'host11'] Online", 
        "['', 'sys', 'class', 'fc_host', 'host12'] Online"
    ]
}

然而我要獲取hosts11 Online和host12 Online的列表,則需使用jinja2的last過濾器獲取該值
echo -n "{{ host.encode().split('/') }}|last "
輸出如下:

ok: [172.23.2.9] => {
    "port_state.stdout_lines": [
        "host11 Online", 
        "host12 Online"
    ]
}

然而,在大規模的環境里,系統信息的獲取時,個人以為shell效率要高於python的,故此處有shell方法:

{%- for host in hba_hosts.stdout_lines -%}
            host={{host}}
            echo -n "${host##*/} "                                    # echo -n "$(basename $host)  "
            #echo -n "{{ host.encode().split('/')|last}} "
            cat {{ host }}/port_state;
{%- endfor -%}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM