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. 标准循环 重复的任务可以用下面的方式: ...
随机推荐
- Linux keepalived工作原理
keepalived简介与工作原理 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他 ...
- content-type 组件
content-type初识 什么是content-type ContentType是Django的内置的一个应用,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中 ...
- winform项目导入数据
一.点击导入按钮,弹出文件选择框 这个方法的使用要引用下面两个命名空间: using System.Windows.Forms;using DevExpress.XtraEditors; privat ...
- 2019 年 3 月 iOS程序员面试心得总结,请大家多多指教!
序言: 今年2月中下旬因为个人原因,换了一份工作,3月初期间面试了有3,4家,基本都是D轮或者刚刚上市的公司,也有上榜的BAT,也从他们的面试笔试中看到了自己的一些不足,于是就想写出来和大家分享一下, ...
- Matlab安装完成后,出现错误licensing error:-8523的解决方法
Matlab2018安装成功后,打开出现licensing error:-8523解决方法 https://blog.csdn.net/qq_41634276/article/details/8000 ...
- Python菜鸟快乐游戏编程_pygame(6)
Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...
- Asp.Net Core 新篇章
一. 二. 三. 系列章节 第一节:.Net Core环境的安装和常用指令 第X节:XXXXXXXXXXXXXXXXXXXXXXXXXXXX 第X节:XXXXXXXXXXXXXXXXXXXXXXXXX ...
- 使用 LD_PRELOAD 变量拦截调用
背景&原理 很多 a.out 程序都依赖动态库 libc.so, 比如使用 strcmp() 比较密码, 其实是不安全的 使用 LD_PRELOAD 变量可以使该变量中的可链接文件(编译时使用 ...
- react-intl
internationalization standard https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob ...
- 开放源代码的设计层面框架Spring——day02
spring第二天 一.基于注解的IOC配置 1.1写在最前 学习基于注解的IOC配置,大家脑海里首先得有一个认知,即注解配置和xml配置要实现的功能是 ...