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 -%}
ansible字符串处理(一)的更多相关文章
- ansible字符串的处理
ansible中字符串的处理 from_json json_query join select selectattr map list trim 列表和字典的处理 combine
- ansible之数据提取与Juniper实例演示
一.Ansible列表两种表达方式 基于YAML的列表 my_list: - a - b - c - d 基于Json格式的列表 {"my_list":[ "a" ...
- ansible取出register变量中最长字符串
背景 在用ansible撰写一个etcd恢复的playbook时,有一个操作是获取etcd启动时的"initial-cluster"启动参数,该参数在etcd集群不同节点不一致,需 ...
- 《Ansible权威指南》笔记(2)——Inventory配置
四.Inventory配置ansible通过Inventory来定义主机和组,使用时通过-i指定读取,默认/etc/ansible/hosts.可以存在多个Inventory,支持动态生成.1.定义主 ...
- ansible模块debug
示例: # Example that prints the loopback address and gateway for each host - debug: msg="System { ...
- ansible模块authorized_key
示例: --- - hosts: test remote_user: root tasks: - name: deliver authorized_keys authorized_key: user: ...
- Ansible简介及常用模块
一.基础介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置. ...
- Ansible状态管理
转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...
- Ansible的循环
Ansible的循环 1. 前言 有可能在一个任务中,可能要做很多事情,例如创建多个用户,安装很多个包等,那么就有可能用到循环. 2. 标准循环 重复的任务可以用下面的方式: ...
随机推荐
- 微信小程序onLaunch、onLoad执行生命周期
原文转载自:微信小程序onLaunch.onLoad执行生命周期 1.需求:先执行App的onLaunch添加验证权限等,再执行Page里的onLoad. 2.问题:还没有等onLaunch执行完成, ...
- Mybatis技术原理理——整体流程理解
前言:2018年,是最杂乱的一年!所以你看我的博客,是不是很空! 网上有很多关于Mybatis原理介绍的博文,这里介绍两篇我个人很推荐的博文 Mybatis3.4.x技术内幕和 MyBaits源码分析 ...
- Xcode10 不能导入头文件(导入头文件不提示)
连接地址:https://blog.csdn.net/wyz670083956/article/details/87774705 xcode10可能是:Project Settings
- python __call__或者说func()()的理解
__call__ 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() ...
- codeforces-1132 (div2)
A.发现b的个数没有意义,a不等于d一定不可行,c不管多少都算一个,如果只有c没有ad也不可行 #include <map> #include <set> #include & ...
- Windows 10 x64 下编译 Hadoop 源码
Windows 10 x64 下编译 Hadoop 源码 环境准备 Hadoop并没有提供官方的 Windows 10 下的安装包,所以需要自己手动来编译,官方文档中 BUILDING.txt 文件中 ...
- Aras前端的一些知识
top.aras包含了aras前端大部分的API /* * uiShowItem * 打开物体视窗 * parameters: * 1) itemTypeName - may be empty str ...
- Bootstrap使用-1
目录 结构: 1. 视图函数 2. 模板 3. 登陆 4. 怎样发生的 添加模板 基础模板提供的block 定制基础模板 结构: $ tree -I "__pycache*|*.pyc|*. ...
- (一)ORB描述子提取
ORBSLAM2中使用ORB描述子的方法 经典的视觉SLAM系统大体分为两种:其一是基于特征点法的,其二是基于直接法的.那么本文主要就讲特征点法的SLAM. 基于特征点法的视觉SLAM系统典型的有PT ...
- Rollup.js 实践
音乐分享: B.o.B Ft. Marko Penn - <Roll up> ——————————————————————————————————————————————————————— ...