具有动态键/值的Ansible设置事实

2024-04-19 21:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从我从另一个角色调用的命令任务的标准设置一个可靠的事实。你知道吗

角色A:

- name: example command
  command: client get -s {{ service }}
  register: vars_string

- name: set vars
  set_fact: vars={{ vars_string.stdout.split('\n')}}
  when:
    - vars_string.stdout | length > 0

- name: set vars as facts
  set_fact: "{{ item }}"
  with_items: "{{ vars }}"

变量输出:

"vars": [
        "tst=ansible", 
        "example=values"
]

角色B:

- debug:
    var: tst

角色B的结果:

期望:{ "tst": "ansible" }

现实:{ "tst": "VARIABLE IS NOT DEFINED!" }

我曾尝试将vars放入dict并使用set_fact: "{{ item.key }}" : "{{ item.value }}"。这返回了相同的结果。你知道吗

我希望能够在以后的角色中通过命令返回的变量名进行调用。有什么想法吗?你知道吗


Tags: name命令角色标准stringexamplestdoutansible
1条回答
网友
1楼 · 发布于 2024-04-19 21:21:34

关于您可能感兴趣的代码片段,有两点:

  • 命令的输出已经有了一个按换行分裂的版本,它是vars_string.stdout_lines
  • 我不知道你是无意中选择了这个变量,还是想把赋值给vars内置变量,但不管怎样,都不要这样做

据我所知,没有支持的语法可以从一个任务中分配任意的顶级主机事实。你知道吗

您有两种选择:将这些变量写到一个文件中,然后使用^{}读取它们,在其中将它们指定为主机事实,或者接受set_fact:想要的方式,并满足于那些存在于hostfacts中已知键下的动态变量

我们先展示后者,因为它比较短:

- set_fact:
    my_facts: >-
      {{ "{" + (vars_string.stdout_lines
      | map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
      | join(",")) + "}"
      }}
  when:
  - vars_string.stdout | length > 0

当然,请注意,如果您的键或值中包含不支持JSON的字符,那么欺骗是行不通的,但是如果这个简单的版本不起作用,请问一个后续问题,因为同样的情况下还有很多欺骗

方法是:

- tempfile:
    state: file
    suffix: .json
  register: vars_filename

- copy:
    dest: '{{ vars_filename.path }}'
    content: >-
       {{ "{" + (vars_string.stdout_lines
       | map('regex_replace', '^([^=]+)=(.+)', '"\1": "\2"')
       | join(",")) + "}"
       }}

- include_vars:
    file: '{{ vars_filename.path }}'

- file:
    path: '{{ vars_filename.path }}'
    state: absent

相关问题 更多 >