2016-09-14 73 views
2

打印出每一个键值对在Ansible配置字典的名单我如何通过字典的列表循环,并在Ansible

myList 
    - name: Bob 
     age: 25 
    - name: Alice 
     age: 18 
     address: USA 

我写的代码为

- name: loop through 
    debug: msg ="{{item.key}}:{{item.value}}" 
    with_items: "{{ myList }}" 

我想要打印出像

msg: "name:Bob age:25 name:Alice age:18 address:USA" 

如何循环访问该字典并获取键和值对?因为它不知道什么是关键。如果我改变如{{item.name}},ansible会的工作,但我也想知道关键

+2

通常对于这样的事情,我会定义一个类,然后利用'__repr__'或'__str__',这取决于你想要多少可读性,因为在你的例子中'msg'看起来很容易解析,我会利用* __ repr__ * – Fallenreaper

+0

谢谢@Fallenreaper。我不擅长python。你能解释一下吗?什么是__repr__或__str__? – Neil

+0

'myList'后面有一个输入错误 - 冒号缺失。 –

回答

3

如果你想通过列表循环和分析每一个项目:

如果你想保持非常简单,你可以做到这一点

- debug: msg="{{ item | dictsort | map('join',':') | join(' ') }}" 
    with_items: "{{ myList }}" 

会打印:

"msg": "age:25 name:Bob" 
"msg": "address:USA age:18 name:Alice" 

如果要将所有内容合并成一行,请使用:

- debug: msg="{{ myList | map('dictsort') | sum(start=[]) | map('join',':') | join(' ') }}" 

这将给:

"msg": "age:25 name:Bob address:USA age:18 name:Alice" 

记住类型的字典不是用Python排序,所以你一般不能指望你的项目是在相同的顺序,在YAML文件。在我的示例中,它们在按照名称过滤器后按键名排序。

+0

我可以保留字典顺序吗? – Neil

+0

@沃尔特恐怕没有。 –

+0

@KonstantinSuvorov如果列表中有第三个“order”字段,您可以使用它来对字典进行排序,然后确保输出中的顺序? –

0

这里是你的文字: myList中 - 名称:鲍勃 年龄:25 - 名称:爱丽丝 年龄:18个 地址:美国

下面是答案:

文本= '''MYLIST - 名称:鲍勃 年龄:25 - 名称:爱丽丝 年龄:18 地址:美国 ''”

>>> final_text='' 

在text.split行( '\ n') : line1 = line.replace('','')。replace(' - ','') if myList'not in line1: final_text + = line1 +''

final_text 的名字:鲍勃年龄:25名:爱丽丝年龄:18地址:美国“

+0

我可以有可靠的语法解决方案吗? – Neil

0
class Person(object): 
    def __init__(self, name, age, address): 
    self.name = name 
    self.age = age 
    self.address = address 

    def __str__(self): 
    # String Representation of your Data. 
    return "name:%s age:%d address:%s" % (self.name, self.age, self.address) 

那么你可以有你创建的对象的列表。我在这里使用一些示例数据来创建一个字典列表。

dict={"name":"Hello World", "age":23, "address":"Test address"} 
myList = [dict,dict,dict] 
objList = [] 
for row in myList: 
    objList.append(str(Person(**row))) 

result = ' '.join(objList) 
print(result) 

它结束了打印:名称:你好世界年龄:23​​地址:测试地址名称:你好世界年龄:23​​地址:测试地址名称:你好世界年龄:23​​个地址:测试地址

我打算做REPR,但用法有所不同,我认为这可能更适合您的需求。分别

dict={"name":"Hello World", "age":23, "address":"Test address"} 
myList = [dict,dict,dict] 
objList = [] 
for row in myList; 
    tmp = [] 
    for k in row: 
    tmp.append("%s:%s" % (k, row[k])) 
    objList.append(" ".join(tmp)) 
print(" ".join(objList)) 
+0

所以在这种情况下,我应该创建一个单独的python文件来处理这个问题,Ansible无法在没有额外的自定义模块的情况下执行此操作。我对吗? – Neil

+0

增加了另一种方式来做到这一点,只有2个小循环 – Fallenreaper

相关问题