Ansible 可变和寄存器值

Ansible 可变和寄存器值,ansible,jinja2,Ansible,Jinja2,如何使用Jinja2筛选ansible获得两台主机的总和 主机1和主机2 --- - name: Count Check hosts: MYGROUP gather_facts: true user: sv_admin tasks: - name: count check shell: cat /etc/hosts | wc -l register: command_result - debug: var: command_

如何使用Jinja2筛选ansible获得两台主机的总和 主机1和主机2

---
- name: Count Check
  hosts: MYGROUP
  gather_facts: true
  user: sv_admin
  tasks:
    - name: count check
      shell: cat /etc/hosts | wc -l
      register: command_result
    - debug:
        var: command_result.stdout
    - set_fact:
        total_result: "{{ command_result.stdout | map('int') | sum(start=0) }}"
    - debug:
        msg: "Total count: {{ total_result }}" 
剧本输出

TASK [debug] *****************************************************************
ok: [Host-01] => {
  "msg": "Total count:      134"
}
ok: [Host-02] => {
  "msg": "Total count:      133"
}

您可以使用自定义统计信息来执行此操作:

所以对于你的情况来说

---
-姓名:计数检查
主持人:MYGROUP
收集事实:真实
用户:sv_管理员
任务:
-姓名:计数检查
外壳:cat/etc/hosts | wc-l
寄存器:命令\u结果
-调试:
var:command_result.stdout
-设定事实:
主机_结果:“{{command_result.stdout}”
-调试:
msg:“此主机的计数:{{host_result}}”
-设置统计信息:
数据:“{{‘总计数’:主机结果{124; int}}”
然后,如果使用
ANSIBLE\u SHOW\u CUSTOM\u STATS=yes运行它,它将在最后显示结果:

$ ANSIBLE_SHOW_CUSTOM_STATS=yes ansible-playbook -i inventory pb.yml
... (usual output)

CUSTOM STATS: *************************************************************

    RUN: { "total_count": 267}

默认情况下,
set_stats
任务将所有主机的结果相加,这就是您要查找的。不过,您需要确保这些值是整数,因为如果它们是字符串,它只会将它们串联起来,最终会得到类似于
RUN:{“total\u count”:“134133”}
的结果。这就是为什么我将
数据:
按我的方式放置—如果您尝试用常规yaml创建字典,如

数据:
总计数:“{host_result}int}”
您将看到该值仍然是一个字符串(由于yaml/jinja的工作方式),它无法正常工作。

使用和。例如,下面的剧本

shell>cat playbook.yml
-主持人:测试组01:测试组03
收集事实:错误
任务:
-外壳:cat/etc/hosts | wc-l
寄存器:命令\u结果
-调试:
var:command_result.stdout
-设定事实:
总结果:“{{ansible\u play\u hosts\u all”|
映射('extract',hostvars,['command_result','stdout']))|
映射('int')|
和}}”
跑一次:对
-调试:
var:总结果
给出(节略)

shell>ansible playbook playbook.yml
播放[测试01:测试03]****
任务[外壳]****
更改:[测试单元01]
更改:[测试03]
任务[调试]****
确定:[测试\u 01]=>{
“命令结果.标准输出”:“62”
}
确定:[测试03]=>{
命令\u结果.stdout:“31”
}
任务[设置事实]****
ok:[测试单元01]
任务[调试]****
确定:[测试03]=>{
“总结果”:“93”
}
确定:[测试\u 01]=>{
“总结果”:“93”
}

  • 看到两者的区别了吗