我正在寻找一种从 Ansible 中的地图列表中提取特定值列表的非丑陋方法。我可以找到一些方法来做到这一点,例如在这里:here,但是我所看到的一切都非常丑陋,感觉应该有一种方法可以让将来阅读它的人更清楚正在做什么。我可以写一个过滤器,但感觉这应该是不必要的,因为它必须相对定期地出现。
我在 Ansible 中有一个像这样的数据结构:
interfaces:
- name: eth0
subnet: 192.168.2
netmask: 255.255.255.0
static_dhcp_hosts:
- {name: "hosta", mac: "00:01:02:03:04:05", ip: "192.168.2.20"}
- name: eth1
subnet: 192.168.5
netmask: 255.255.255.0
static_dhcp_hosts:
- {name: "hostb", mac: "00:02:03:04:05:06", ip: "192.168.5.20"}
- {name: "hostc", mac: "00:03:04:05:06:07", ip: "192.168.5.21"}
Run Code Online (Sandbox Code Playgroud)
我想得到一个空格分隔的接口名称列表,所以
eth0 eth1
Run Code Online (Sandbox Code Playgroud)
显然这只是示例数据,实际的顶级列表对于一台主机有 10 个元素。我知道我可以使用连接过滤器从接口列表中获取我想要的字符串以及如何做到这一点。
任何人都可以提出一个很好的方法来制作列表,这对未来的维护者来说是可读的(代码/配置应该尽可能地(而不是进一步)自我记录)?
我正在做类似的事情
{% for interface in interfaces %}{{ interface.name }} {% endfor %}
Run Code Online (Sandbox Code Playgroud)
或者
" ".join([ interface['name'] for interface in interfaces ])
Run Code Online (Sandbox Code Playgroud)
在 Python 中。
但是,AFAIK,你不能,或者被认为是不好的做法,在角色的任务/main.yml …
所以,这是一组关于如何在包/子包中使用 __init__.py 的问题。我已经搜索过,但令人惊讶的是没有找到一个像样的答案。
如果我有以下结构(这显然只是一个简化的例子):
my_package/
__init__.py
module1.py
my_sub_package/
__init__.py
module2.py
Run Code Online (Sandbox Code Playgroud)
module1.py 的内容是
my_string = 'Hello'
Run Code Online (Sandbox Code Playgroud)
module2.py 的内容是
my_int = 42
Run Code Online (Sandbox Code Playgroud)
__init__.py 文件中应该有什么?
我可以将它们留空,在这种情况下,import my_package实际上什么都不做(显然它导入了包,但包实际上什么都不包含)。这显然很好,大多数情况下应该会发生什么。
在这种情况下,我想要的是import my_package允许我使用my_package.module1.my_string和my_package.my_sub_package.module2.my_int。
我可以添加__all__ = [ 'module1' ]到 my_package/__init__.py 和__all__ = [ 'module2' ]my_package/my_sub_package/__init__.py,但这只会影响使用我理解的通配符的导入(所以只有from my_package import *和from my_package.my_sub_package import *)。
我可以通过把
import my_package.module1
import my_package.my_sub_package
Run Code Online (Sandbox Code Playgroud)
在 my_package/__init__.py 和
import my_package.my_sub_package.module2
Run Code Online (Sandbox Code Playgroud)
在 my_package/my_sub_package/__init__.py 中,但这是个坏主意吗?当我在 Python 解释器 (3.5.5) 中执行此操作时,它会创建一个(看似)无限系列的 my_package.my_package.my_package....。
如果我想改为能够执行以下操作 …