首页 > 其他分享 >ansible中字符串处理

ansible中字符串处理

时间:2023-03-25 10:01:28浏览次数:42  
标签:00 stdout 处理 hba state host ansible hosts 字符串

[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 -%}

标签:00,stdout,处理,hba,state,host,ansible,hosts,字符串
From: https://blog.51cto.com/u_13236892/6148922

相关文章

  • 全面了解 Redis 高级特性,实现高性能、高可靠的数据存储和处理
    目录高性能、高可用、高可扩展性的原理持久化RDB持久化AOF持久化持久化的配置RDB配置AOF配置持久化的恢复RDB的恢复AOF的恢复RDB和AOF的选择持久化对性能的影响数据的丢失......
  • 网络异常与网络断开,发送AJAX处理
    <!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> <styletype="text/css"> #result{ width:300px; height:100px; ......
  • JavaScript数值计算时精度问题处理
    js精度问题当使用JavaScript进行数值计算时,会面临一些精度问题,这些问题可能会导致不正确的结果。以下是一些常见的奇奇怪怪的js数据精度问题:1.浮点数精度问题在JS......
  • Springboot整合kafka实现高效的消息传递和处理
    Kafka是一个分布式的流处理平台,它可以处理高吞吐量的消息。SpringBoot是一个流行的Java开发框架,提供了快速构建应用程序的能力。将这两者结合起来可以实现高效的消息传递......
  • ASP 代码示例,可以生成一个8位随机字符串由字母和数字组成
     ChatGP回答的:下面是一个ASP代码示例,可以生成一个8位随机字符串由字母和数字组成:```FunctiongenerateRandomString(length)dimchars,i,resultchars="A......
  • 列表、元组、字典、集合、字符串
    列表1、列表的定义定义格式:list1=[e1,e2,e3,e4...] 说明:1、空列表用[]表示 2、列表中可以存储任意类型的数据2、根据列表索引获取元素飞飞飞3、列表的切片操......
  • 实验2 字符串和列表
    实验任务1task1.py实验源码:x='nbaFIFA'print(x.upper())print(x.lower())print(x.swapcase())print()x='abc'print(x.center(10,'*'))print(x.ljust(1......
  • 不要依赖业务逻辑和系统架构处理一些判断
    今天上线前就遇到一个NullPointException,原本依赖于前端处理,如果字段没值就不会传递改key进入json中,但是上线的数据铺垫是直接解析的excel和api调用的,跳过了前端的一些逻......
  • 一系列的链式处理中保留源
    发现个比较奇葩的,定义了触发条件,但是在后续的一系列处理过程中,触发事件的信息记录会不断在方法传递中丢弃,最终关键的一些数据也不保存进入db,导致我某个业务需要该值的时候,......
  • c++ 从字符串到文件读写
    学习C++的输入输出,比起java来有种空虚的感觉,不会就这么少吧!转码也没见到!java是跨平台语言,之所以跨平台是因为java语言本身就带着一个平台,java运行在虚拟机之上;灵活是以......