gpt4 book ai didi

ansible - 使用循环(set_fact 或其他?)为变量赋值

转载 作者:行者123 更新时间:2023-12-05 04:27:23 25 4
gpt4 key购买 nike

使用 Ansible 任务,我尝试从返回的循环对象创建变量和关联值。
引用:https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html

- name: Get values
someModule:
input_from_loop: "{{ item }}"
loop:
- "foo"
- "bar"
register: get_result

给予

get_result:
changed: false
msg: All items completed
results:
- ansible_loop_var: item
item: foo
alpha:
beta:
content: someFooValue
- ansible_loop_var: item
item: bar
alpha:
beta:
content: someBarValue

使用此 get_result 对象,我尝试创建变量和关联值,以便:

伪代码:

- name: Assign values
set_fact:
"{{ item.item }}":"{{ item.alpha.beta.content }}"
loop: get_result.results

导致:

foo:someFooValue
bar:someBarValue

我似乎无法解决这个错误

Implicit map keys need to be followed by map values"
I do not want to create a new object, just variables with values for later use (in existing tasks).

我尝试了几种方法都无济于事。

[或者它可以在调用模块的初始循环的每次迭代中发生吗?]

最佳答案

现在我正在重新阅读您的要求,我想知道您是否在主机的顶层寻找将被命名的变量

  • foo 并包含 someFooValue
  • bar 并包含 someBarValue

如果是这种情况,那么上面的大部分内容仍然适用,事实的登记只是改变:

- set_fact: { "{{ item.0 }}": "{{ item.1 }}" }
loop: "{{
get_result.results | map(attribute='item') | zip(
get_result.results | map(attribute='alpha.beta.content')
)
}}"

它为您提供了两个具有相应值的预期变量。

ok: [localhost] => 
foo: someFooValue

ok: [localhost] =>
bar: someBarValue

在这种情况下,您可以做的是将字典分解为多个列表,所有列表都包含您感兴趣的字段之一,使用 map 过滤器,然后重建一个列表在 zip 过滤器的帮助下列出。最后,将所有内容结合在一起。

因此,对于这样的任务:

- set_fact:
formatted_fact: "{{
get_result.results | map(attribute='item') | zip(
get_result.results | map(attribute='alpha.beta.content')
) | map('join', ':') | join('\n')
}}"

您得到预期的输出:

formatted_fact: |-
foo:someFooValue
bar:someBarValue

鉴于这对任务,我们有两种可能性:

- set_fact:
formatted_fact: "{{
get_result.results | map(attribute='item') | zip(
get_result.results | map(attribute='alpha.beta.content')
) | map('join', ':') | join('\n')
}}"
vars:
get_result:
changed: false
msg: All items completed
results:
- ansible_loop_var: item
item: foo
alpha:
beta:
content: someFooValue
- ansible_loop_var: item
item: bar
alpha:
beta:
content: someBarValue

- debug:
var: formatted_fact

- set_fact: { "{{ item.0 }}": "{{ item.1 }}" }
loop: "{{
get_result.results | map(attribute='item') | zip(
get_result.results | map(attribute='alpha.beta.content')
)
}}"
vars:
get_result:
changed: false
msg: All items completed
results:
- ansible_loop_var: item
item: foo
alpha:
beta:
content: someFooValue
- ansible_loop_var: item
item: bar
alpha:
beta:
content: someBarValue

- debug:
var: foo

- debug:
var: bar

他们会屈服:

TASK [set_fact] **************************************************************
ok: [localhost]

TASK [debug] *****************************************************************
ok: [localhost] =>
formatted_fact: |-
foo:someFooValue
bar:someBarValue

TASK [set_fact] **************************************************************
ok: [localhost] => (item=['foo', 'someFooValue'])
ok: [localhost] => (item=['bar', 'someBarValue'])

TASK [debug] *****************************************************************
ok: [localhost] =>
foo: someFooValue

TASK [debug] *****************************************************************
ok: [localhost] =>
bar: someBarValue

关于ansible - 使用循环(set_fact 或其他?)为变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72818453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com