Ansible中有没有办法将整数转换为MAC地址?

问题描述 投票:0回答:2

我有一个整数,我需要转换成MAC地址。我在 Ansible 中检查

hwaddr
,但对我不起作用。请帮帮我。

我尝试了像

ipmath
hwaddr
这样的内置模块。没有什么方便。

python ansible jinja2 ansible-facts
2个回答
3
投票

我有一个整数,我需要转换成MAC地址。

这不是最漂亮的答案,请确保 pip 包

netaddr
安装在控制器上。可以通过
python3 -m pip install netaddr
来完成。

- debug:
    msg: "{{ 143683695594496 | int | hwaddr('unix') }}"

返回:

82:ad:f7:a2:cc:00


3
投票

基于

  • tripleee给出的评论
  • Rafael 之前给出的答案(...现已删除
  • Kevin C 给出的答案
  • 关于安装 Python
    netaddr
    软件包的依赖关系(...我想删除
    TASK [Show MAC] *************************************************************************
    fatal: [localhost]: FAILED! =>
      msg: The hwaddr filter requires python's netaddr be installed on the ansible controller
    
  • 以及格式,我的测试结果中缺少前导零
    0:ae:cd:9:db:50
    

我根据 Tripleee 的评论和 Rafel 的回答制作了一个示例过滤器插件。

cat 插件/filter/int2mac.py

#!/usr/bin/python

class FilterModule(object):
    def filters(self):
        return {
            'int2mac': self.int2mac,
        }

    def int2mac(self, IntegerValue):
        return ':'.join(['{}{}'.format(a, b)
                         for a, b
                         in zip(*[iter('{:012x}'.format(IntegerValue))]*2)
                       ])

return

部分的来源
Github Gist 'nlm' 以及几乎 Tripleee 的评论。还有第二个示例,可以用作编写自己的过滤器插件的起点。无论如何,请注意Gist 的默认许可证

示例剧本 int2mac.yml

---
- hosts: localhost
  become: false
  gather_facts: false

  vars:

  tasks:

  - name: Show MAC
    debug:
      msg: "{{ 750764284752 | int2mac }}"

将产生

的输出
TASK [Show MAC] *********
ok: [localhost] =>
  msg: 00:ae:cd:09:db:50

换句话说,您可以利用 Python 及其几乎所有功能来增强您的 Ansible 和 playbook,例如通过创建简单的过滤器或其他插件。这意味着如果未提供功能或行为不符合您的要求,您可以直接创建它们。

进一步问答

...关于编写自己的简单过滤器插件


一些注意事项

使用tripleee评论中的方法

        return ':'.join([
                           ("%12x" % IntegerValue)[x:x+2] for x in range(0, 12, 2)
                       ])

将产生

的输出
TASK [Show MAC] **********
ok: [localhost] =>
  msg: '  :ae:cd:09:db:50'

并且缺少零。

使用 Kevin C 答案中的

hwaddr
过滤器的方法

      msg: "{{ 15 | int | hwaddr('unix') }}"

将产生

的输出
TASK [Show MAC] **
ok: [localhost] =>
  msg: 0:0:0:0:0:f

并且缺少前导零。

根据 IEEE OUI,有些供应商拥有大量前导零。

使用

      msg: "{{ 15 | int | hwaddr('linux') }}"

将产生

的输出
TASK [Show MAC] ********
ok: [localhost] =>
  msg: 00:00:00:00:00:0f

从给定的示例中,我们可以看出为什么有必要提供最小的、可重复的示例以及所有必要的输入和预期输出。

© www.soinside.com 2019 - 2024. All rights reserved.