如果用户是特定组的成员,我正在编写一个为用户安装共享文件夹的角色。除了按键比较两个对象之外,一切都证明了。在所有操作之后,我有这个:
原则上可以挂载的内容列表(但如果没有权限,那么它当然不会让你进去):
"united_info_about_shares_fact": [
{
"PathToShare": "//depit.my.domain/depit",
"ShareAccessGroups": "it_group",
"ShareName": "Общая папка управления IT"
},
{
"PathToShare": "//share.edu.my.domain/share",
"ShareAccessGroups": "edu_ecc_share",
"ShareName": "Общая папка для студентов и преподавателей"
},
{
"PathToShare": "//storage.my.domain/kaf_raket-dvig",
"ShareAccessGroups": "kaf_raket-dvig",
"ShareName": "Общая папка кафедры ракетных двигателей"
},
{
"PathToShare": "//storage.my.domain/dek_fisis",
"ShareAccessGroups": "dek_fisis_share",
"ShareName": "Общая папка деканата ФИСИС"
},
{
"PathToShare": "//storage.my.domain/kaf_fiziki-tverd-tela",
"ShareAccessGroups": "kaf_fiziki-tverd-tela_share",
"ShareName": "Общая папка кафедры физики твёрдого тела"
}
]
用户所属组的列表:
"user_groups_list_fact": [
{
"ShareAccessGroups": "it_group"
},
{
"ShareAccessGroups": "vpn_users"
},
{
"ShareAccessGroups": "wifi_users"
},
{
"ShareAccessGroups": "edu_ecc_share"
},
{
"ShareAccessGroups": "site_users"
}
]
那些。我希望它给我:
{
"PathToShare": "//depit.my.domain/depit",
"ShareAccessGroups": "it_group",
"ShareName": "Общая папка управления IT"
},
{
"PathToShare": "//share.edu.my.domain/share",
"ShareAccessGroups": "edu_ecc_share",
"ShareName": "Общая папка для студентов и преподавателей"
},
谷歌搜索将我带到https://stackoverflow.com/a/58487241和https://stackoverflow.com/a/56396809但我无法适应。结果是这样的,但代码不起作用:
- debug:
msg: "{{ item.PathToShare }}"
loop: "{{ united_info_about_shares_fact }}"
when: "united_info_about_shares_fact | intersect(user_groups_list_fact | json_query('[*].ShareAccessGroups')) | length == 0"
UPD。我又挖了一些,但我只能得到一个元素:
- set_fact:
matching_by_groups: "{{ united_info_about_shares_fact | json_query('[*].ShareAccessGroups') | intersect(user_groups_list_fact | json_query('[*].ShareAccessGroups')) }}"
- set_fact:
needed_shares: "{{ united_info_about_shares_fact | json_query(query_for_get_needed_shares) }}"
loop: "{{ united_info_about_shares_fact }}"
with_items: "{{ united_info_about_shares_fact }}"
vars:
query_for_get_needed_shares: "[?ShareAccessGroups == `{{ matching_by_groups[0] }}`]"
一切都和我最初想的一样,但仍然有它的麻烦。所以:
我需要停止认为如果我需要
это这两个值это,это那么我需要在 Google 上搜索这个词and。需要搜索or。结果是这样的:
因为 没有共享文件夹附加到组
vpn_users,然后我得到了我想要得到的东西(见问题)。但是出现了一个问题:如何重新制作和传输此列表,以便在此过程中没有任何中断?转换
{"ShareAccessGroups": "it_group"},为ShareAccessGroups == 'it_group',推入set_facts和转移 - 它不起作用,尽管在任何地方似乎一切都很好。那些。设计没用。但形成的文件和
include_vars. 结果很可怕,但幂等性也有效:我们
json从一个问题转换成一个可以咀嚼的字符串jmespath:我们写入文件:
我们包括并得到一个新的事实:
PS 原则上,如果以后需要拉取用户当前所在的组的列表,那么
vars_query_for_get_needed_shares.yml最好将文件形成拉到单独的任务\剧本\角色中,取一个更通用的名称。然后可以从其他地方包含转换时间,以节省转换时间(我使用了排气/usr/bin/id)。