使用Ansible时如何管理数组中的每个项

使用Ansible时如何管理数组中的每个项,ansible,ansible-filter,Ansible,Ansible Filter,特殊变量ansible\u role\u names包含一个数组,其中包含角色名称。比如说 "ansible_role_names": [ "geerlingguy.nfs", "ANXS.openssh", "robertdebock.bootstrap", "robertdebock.squid" ] 这个列表我想访问然而,这是一个列表与所有之前的点删除 "roles": [ "nfs", "openssh", "boots

特殊变量
ansible\u role\u names
包含一个数组,其中包含角色名称。比如说

"ansible_role_names": [
    "geerlingguy.nfs", 
    "ANXS.openssh", 
    "robertdebock.bootstrap", 
    "robertdebock.squid"
]
这个列表我想访问然而,这是一个列表与所有之前的点删除

"roles": [
    "nfs", 
    "openssh", 
    "bootstrap", 
    "squid"    ]

您可以使用
split
过滤器获得它:

- debug:
    msg: "{{ item.split('.')[-1] }}"
  loop: "{{ ansible_role_names }}"

基于@Arbab-Nazar-answer的构建:在点上拆分字符串,并在结果列表上使用索引
1
,在某些情况下可能会中断

  • 如果您的角色名称不包含点(对于本地角色来说非常常见),您将得到一个错误,其中有一个未定义的变量=>
    list对象没有元素1
  • 在(不太可能…)情况下,您的角色名称中有几个点,您将始终获得字符串中的第二个元素,而不是最后一个元素
使用
-1
作为索引(例如,从末尾开始的第一个元素)将解决以下两个潜在问题:

- debug:
    msg: "{{ item.split('.')[-1] }}"
  loop:
    - simplerole
    - classic.galaxyrole
    - non.standard.customrole
结果如下:

TASK [debug] ************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=simplerole) => {
    "msg": "simplerole"
}
ok: [localhost] => (item=classic.galaxyrole) => {
    "msg": "galaxyrole"
}
ok: [localhost] => (item=non.standard.customrole) => {
    "msg": "customrole"
}
Q:“使用Ansible时如何操作数组中的每个项?”

答:可以映射过滤器。比如这出戏

- set_fact:
    my_list: "{{ ansible_role_names|
                 map('regex_replace', regex, replace)|
                 list }}"
  vars:
    regex: '^(.*)\.(.*)$'
    replace: '\2'
- debug:
    var: my_list
给予


regex:'^(.*)\.(.*)$'

  • ^
    匹配字符串的开头
  • (.*)
    匹配捕获组1中的任何字符
  • \。
    匹配
  • (.*)
    匹配第2捕获组中的任何字符
  • $
    匹配字符串的结尾
替换:'\2'

  • \2
    与先前定义的第2捕获组匹配

我只花了4小时就找到了同样问题的解决方案。从未听说过regex+replace args。这也解决了我的问题,谢谢!
"my_list": [
    "nfs", 
    "openssh", 
    "bootstrap", 
    "squid"
]