我有一个整数,我需要转换成MAC地址。我在 Ansible 中检查
hwaddr
,但对我不起作用。请帮帮我。
我尝试了像
ipmath
和hwaddr
这样的内置模块。没有什么方便。
我有一个整数,我需要转换成MAC地址。
这不是最漂亮的答案,请确保 pip 包
netaddr
安装在控制器上。可以通过python3 -m pip install netaddr
来完成。
- debug:
msg: "{{ 143683695594496 | int | hwaddr('unix') }}"
返回:
82:ad:f7:a2:cc:00
基于
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'
并且缺少零。
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
从给定的示例中,我们可以看出为什么有必要提供最小的、可重复的示例以及所有必要的输入和预期输出。