首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从ansible_default_ipv4.macaddress过滤数据

从ansible_default_ipv4.macaddress过滤数据
EN

Stack Overflow用户
提问于 2022-06-01 13:16:41
回答 2查看 201关注 0票数 1

亲爱的社区,我请求您的帮助。

我会创建一个游戏手册,它将使用输入中给定的宏地址,并且应该尊重Unix格式。然后,如果给定的地址符合所需的格式,则另一个任务将检查给定的宏地址是否与主机中的已存在的地址匹配,**如果不存在,它将显示the interface related to that macaddress (如果没有),任务将失败,并带有错误消息"No interfaces found with mac address '$MACADDRESS'. Fatal error."

以下是我所做的,我不知道应该做些什么来实现这个目标:

代码语言:javascript
运行
复制
- hosts: all
  gather_facts: no
  vars_prompt:
    - name: "MACADDRESS"
      prompt: "mac address?(please use Unix format ex- 1a:2b:3c:4d:5e:6f )"
      private: no


  tasks:
    - name: check macaddresssyntax
      debug:
        msg: "{{ MACADDRESS | ansible.utils.hwaddr('unix') }}"
      register: mac_syntax
      failed_when: mac_syntax failed


    - name: check local mac
      debug:
        var: mac_syntax |intersect (ansible_facts['default_ipv4']|selectattr('macaddress') | map(attribute='interface')|list)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-01 13:46:32

  1. 通常不注册debug任务的结果(因为它没有用)。如果您想在某人输入无效的MAC地址时失败,请使用fail任务:
  • 名称:选中mac地址语法失败: msg:“无效mac地址语法”时: not MACADDRESS|ansible.utils.hwaddr('unix')
  1. 您已经将gather_facts设置为false,但是由于不能进行事实收集,Ansible不会为您提供任何事实。如果希望Ansible向您提供有关主机接口的信息,则需要启用事实收集。
  2. 我不完全确定您在check local mac任务中要做什么,但这似乎完成了您所要求的内容:
  • 主机: localhost gather_facts:- vars_prompt:- name:"mac地址“提示:”mac地址?“(请使用Unix格式ex- 1a:2b:3c:4d:5e:6f )”私有:没有任务:-名称:检查宏地址语法失败: msg:“它是一个接口名称的列表。如果matched\_interface #变量具有#匹配的MAC地址,则将其设置为当前接口名。-名称:检查本地mac set_fact: matched_interface:"{{ ifname }}“时:>-查找(‘vars’,set_fact == MACADDRESS vars:#由于任何原因,ansible用\_替换接口#name中的-。如果名称:{{ item.replace('-',‘_’}}“循环:{{ ansible_interfaces }}”-调试: msg:“与{{ ansible_interfaces }}相关的接口是{{ matched_interface }}”时:matched_interface|default(假)-matched_interface|default: msg:“没有找到带有mac地址{ MACADDRESS }}的接口”时:Notmatched_interface|default(False)

在我的系统上运行上面的剧本,它有一个与address a2:29:ab:4e:e7:74的接口,如下所示:

代码语言:javascript
运行
复制
$ ansible-playbook playbook.yaml -e MACADDRESS='a2:29:ab:4e:e7:74
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [check macaddresssyntax] **************************************************
skipping: [localhost]

TASK [check local mac] *********************************************************
skipping: [localhost] => (item=veth92b9a89f) 
...
ok: [localhost] => (item=example)
skipping: [localhost] => (item=lo) 
...

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "the interface related to a2:29:ab:4e:e7:74 is example"
}

TASK [fail] ********************************************************************
skipping: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   

如果我使用我的系统中不存在的MAC地址运行它,我得到:

代码语言:javascript
运行
复制
TASK [check local mac] *********************************************************
skipping: [localhost] => (item=veth168ad56c) 
...

TASK [debug] *******************************************************************
skipping: [localhost]

TASK [fail] ********************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "no interfaces found with mac address a2:29:ab:4e:e7:77"}

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=1    skipped=3    rescued=0    ignored=0   
票数 2
EN

Stack Overflow用户

发布于 2022-06-01 16:39:43

收集网络事实并获取接口列表。例如,

代码语言:javascript
运行
复制
    - setup:
        gather_subset: network
    - debug:
        var: ansible_facts.interfaces

给出

代码语言:javascript
运行
复制
ansible_facts.interfaces:
  - lo0
  - lo1
  - pflog0
  - wlan0

将声明放在下面作为适切

代码语言:javascript
运行
复制
_ifcs: "{{ ansible_facts.interfaces|map('extract', ansible_facts)|list }}"
_macs: "{{ _ifcs|json_query('[].macaddress') }}"
_devs: "{{ _ifcs|json_query('[].device') }}"
_macs_valid: "{{ _macs|map('ansible.utils.hwaddr', 'bool')|
                       map('ternary', true, false)|list }}"
_dev_mac_valid: "{{ _devs|zip(_macs)|zip(_macs_valid)|
                          map('flatten')|
                          selectattr(2) }}"
dev_mac_valid: "{{ _dev_mac_valid|map('zip', ['dev', 'mac', 'valid'])|
                                  map('map', 'reverse')|
                                  map('community.general.dict') }}"
dev_mac: "{{ dev_mac_valid|items2dict(key_name='dev', value_name='mac') }}"
mac_dev: "{{ dev_mac_valid|items2dict(key_name='mac', value_name='dev') }}"

例如,这些计算值为

代码语言:javascript
运行
复制
_macs: [unknown, unknown, unknown, '00:12:00:34:56:78']
_macs_valid: [false, false, false, true]
_devs: [lo0, lo1, pflog0, wlan0]
_dev_mac_valid:
  - [wlan0, '00:12:00:34:56:78', true]

dev_mac_valid:
  - dev: wlan0
    mac: 00:12:00:34:56:78
    valid: true

dev_mac:
  wlan0: 00:12:00:34:56:78

mac_dev:
  00:12:00:34:56:78: wlan0

问:“检查给定的宏地址是否与主机中的现有地址匹配”

A:使用字典mac_dev。例如,

代码语言:javascript
运行
复制
    - pause:
        prompt: "Enter MAC address"
      register: result
    - set_fact:
        macaddress: "{{ result.user_input }}"
    - assert:
        that: macaddress|ansible.utils.hwaddr('bool')
        fail_msg: Wrong MAC address
    - assert:
        that: macaddress in mac_dev.keys()|list
        fail_msg: "No interfaces found with mac address {{ macaddress }}"
        success_msg: "Interfaces {{ mac_dev[macaddress] }} found
                      with mac address {{ macaddress }}"

如果有更多的主机,请声明所有主机的字典。

代码语言:javascript
运行
复制
mac_dev_hosts: "{{ dict(ansible_play_hosts|
                        zip(ansible_play_hosts|
                            map('extract', hostvars, 'mac_dev'))) }}"

然后,把所有的东西放在一起,例如,剧本

代码语言:javascript
运行
复制
- hosts: test_11,test_12,test_13
  gather_facts: false
  vars:
    _ifcs: "{{ ansible_facts.interfaces|map('extract', ansible_facts)|list }}"
    _macs: "{{ _ifcs|json_query('[].macaddress') }}"
    _devs: "{{ _ifcs|json_query('[].device') }}"
    _macs_valid: "{{ _macs|map('ansible.utils.hwaddr', 'bool')|
                           map('ternary', true, false)|list }}"
    _dev_mac_valid: "{{ _devs|zip(_macs)|zip(_macs_valid)|
                              map('flatten')|
                              selectattr(2) }}"
    dev_mac_valid: "{{ _dev_mac_valid|map('zip', ['dev', 'mac', 'valid'])|
                                      map('map', 'reverse')|
                                      map('community.general.dict') }}"
    dev_mac: "{{ dev_mac_valid|items2dict(key_name='dev', value_name='mac') }}"
    mac_dev: "{{ dev_mac_valid|items2dict(key_name='mac', value_name='dev') }}"
    mac_dev_hosts: "{{ dict(ansible_play_hosts|
                            zip(ansible_play_hosts|
                                map('extract', hostvars, 'mac_dev'))) }}"

  tasks:
    - setup:
        gather_subset: network
    - set_fact:
        mac_dev: "{{ mac_dev }}"

    - block:
        - debug:
            var: mac_dev_hosts|to_nice_yaml
        - pause:
            prompt: "Enter MAC address"
          register: result
        - set_fact:
            macaddress: "{{ result.user_input }}"
        - assert:
            that: macaddress|ansible.utils.hwaddr('bool')
            fail_msg: Wrong MAC address
        - assert:
            that: macaddress in mac_dev_hosts|json_query('*.keys(@)')|flatten
            fail_msg: "No interface found with mac address {{ macaddress }}"
        - debug:
            msg: "Interface {{ dev }} found with mac address {{ macaddress }}
                  at {{ hst }}"
          vars:
            itm: "{{ mac_dev_hosts|dict2items|
                     selectattr('value', 'contains', macaddress)|first }}"
            hst: "{{ itm.key }}"
            dev: "{{ itm.value[macaddress] }}"
      run_once: true

给出

代码语言:javascript
运行
复制
PLAY [test_11,test_12,test_13] ***************************************************************

TASK [setup] *********************************************************************************
ok: [test_13]
ok: [test_12]
ok: [test_11]

TASK [set_fact] ******************************************************************************
ok: [test_13]
ok: [test_11]
ok: [test_12]

TASK [debug] *********************************************************************************
ok: [test_11] => 
  mac_dev_hosts|to_nice_yaml: |-
    test_11:
        00:12:00:34:56:AA: wlan0
    test_12:
        00:12:00:34:56:BB: wlan0
    test_13:
        00:12:00:34:56:CC: wlan0

TASK [pause] *********************************************************************************
[pause]
Enter MAC address:
00:12:00:34:56:CC^Mok: [test_11]

TASK [set_fact] ******************************************************************************
ok: [test_11]

TASK [assert] ********************************************************************************
ok: [test_11] => changed=false 
  msg: All assertions passed

TASK [assert] ********************************************************************************
ok: [test_11] => changed=false 
  msg: All assertions passed

TASK [debug] *********************************************************************************
ok: [test_11] => 
  msg: Interface wlan0 found with mac address 00:12:00:34:56:CC at test_13

PLAY RECAP ***********************************************************************************
test_11: ok=8    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_12: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_13: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

例如,如果MAC缺失,游戏就会失败。

代码语言:javascript
运行
复制
TASK [assert] ********************************************************************************
fatal: [test_11]: FAILED! => changed=false 
  assertion: macaddress in mac_dev_hosts|json_query('*.keys(@)')|flatten
  evaluated_to: false
  msg: No interface found with mac address 00:12:00:34:56:FF
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72462535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档