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

ansible字符串处理(一)的更多相关文章

  1. ansible字符串的处理

    ansible中字符串的处理 from_json json_query join select selectattr map list trim 列表和字典的处理 combine

  2. ansible之数据提取与Juniper实例演示

    一.Ansible列表两种表达方式 基于YAML的列表 my_list: - a - b - c - d 基于Json格式的列表 {"my_list":[ "a" ...

  3. ansible取出register变量中最长字符串

    背景 在用ansible撰写一个etcd恢复的playbook时,有一个操作是获取etcd启动时的"initial-cluster"启动参数,该参数在etcd集群不同节点不一致,需 ...

  4. 《Ansible权威指南》笔记(2)——Inventory配置

    四.Inventory配置ansible通过Inventory来定义主机和组,使用时通过-i指定读取,默认/etc/ansible/hosts.可以存在多个Inventory,支持动态生成.1.定义主 ...

  5. ansible模块debug

    示例: # Example that prints the loopback address and gateway for each host - debug: msg="System { ...

  6. ansible模块authorized_key

    示例: --- - hosts: test remote_user: root tasks: - name: deliver authorized_keys authorized_key: user: ...

  7. Ansible简介及常用模块

    一.基础介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置. ...

  8. Ansible状态管理

     转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...

  9. Ansible的循环

    Ansible的循环 1.       前言 有可能在一个任务中,可能要做很多事情,例如创建多个用户,安装很多个包等,那么就有可能用到循环. 2.       标准循环 重复的任务可以用下面的方式: ...

随机推荐

  1. 微信小程序onLaunch、onLoad执行生命周期

    原文转载自:微信小程序onLaunch.onLoad执行生命周期 1.需求:先执行App的onLaunch添加验证权限等,再执行Page里的onLoad. 2.问题:还没有等onLaunch执行完成, ...

  2. Mybatis技术原理理——整体流程理解

    前言:2018年,是最杂乱的一年!所以你看我的博客,是不是很空! 网上有很多关于Mybatis原理介绍的博文,这里介绍两篇我个人很推荐的博文 Mybatis3.4.x技术内幕和 MyBaits源码分析 ...

  3. Xcode10 不能导入头文件(导入头文件不提示)

    连接地址:https://blog.csdn.net/wyz670083956/article/details/87774705 xcode10可能是:Project Settings

  4. python __call__或者说func()()的理解

    __call__ 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() ...

  5. codeforces-1132 (div2)

    A.发现b的个数没有意义,a不等于d一定不可行,c不管多少都算一个,如果只有c没有ad也不可行 #include <map> #include <set> #include & ...

  6. Windows 10 x64 下编译 Hadoop 源码

    Windows 10 x64 下编译 Hadoop 源码 环境准备 Hadoop并没有提供官方的 Windows 10 下的安装包,所以需要自己手动来编译,官方文档中 BUILDING.txt 文件中 ...

  7. Aras前端的一些知识

    top.aras包含了aras前端大部分的API /* * uiShowItem * 打开物体视窗 * parameters: * 1) itemTypeName - may be empty str ...

  8. Bootstrap使用-1

    目录 结构: 1. 视图函数 2. 模板 3. 登陆 4. 怎样发生的 添加模板 基础模板提供的block 定制基础模板 结构: $ tree -I "__pycache*|*.pyc|*. ...

  9. (一)ORB描述子提取

    ORBSLAM2中使用ORB描述子的方法 经典的视觉SLAM系统大体分为两种:其一是基于特征点法的,其二是基于直接法的.那么本文主要就讲特征点法的SLAM. 基于特征点法的视觉SLAM系统典型的有PT ...

  10. Rollup.js 实践

    音乐分享: B.o.B Ft. Marko Penn - <Roll up> ——————————————————————————————————————————————————————— ...