在 Ansible 中比较两个列表

问题描述 投票:0回答:1

我正在制作自己的小型集群服务器并通过 Ansible 配置所有内容,但我有点卡在检查变量是否已插入到

/boot/firmware/cmdline.txt
中。

假设

group_vars/all.yml
包含以下定义:

cgroup_vars:
  - 'cgroup_enable=cpuset'
  - 'cgroup_memory=1'
  - 'cgroup_enable=memory'

我将内容加载到变量中,并在我的剧本中执行以下任务:

  - name: Read cmdline.txt for use below.
    shell: 'cat /boot/firmware/cmdline.txt'
    register: cmdline

  - name: Get individual environmental variables from cmdline.txt
    set_fact:
      cmd_vars: "{{ cmdline.stdout | split() }}"

{{ cmd_vars | to_nice_yaml }}
的输出类似于:

  msg: |-
    - console=serial0,115200
    - console=tty1
    - root=PARTUUID=52e8c2a3-02
    - rootfstype=ext4
    - fsck.repair=yes
    - rootwait
    - cgroup_enable=cpuset
    - cgroup_memory=1
    - cgroup_enable=memory

这应该给我留下两个列表:

cgroup_vars
cmd_vars

如何检查cgroup_vars中的

所有
项目是否在
cmd_vars
中找到?

我希望结果是一个新列表,其中包含是否找到单个项目的答案。

ansible yaml
1个回答
0
投票

嗯......在我提出问题后不久,并在谷歌上进行了更多搜索,我发现了一个解决方案,它的工作比我计划的要简单一些。

这个想法是,如果缺少任何变量,那么我只需添加缺少的变量并跳过其余的。

这给了我以下剧本:


  # Copied from initial question
  - name: Read cmdline.txt for use below.
    shell: 'cat /boot/firmware/cmdline.txt'
    register: cmdline

  # Copied from initial question
  - name: Get individual environmental variables from cmdline.txt
    set_fact:
      cmd_vars: "{{ cmdline.stdout | split() }}"

  - name: Enable K3S cluster variables
    replace:
      path: '/boot/firmware/cmdline.txt'
      regexp: '^([\w](?!.*\b{{ item }}\b).*)$'
      replace: '\1 {{ item }}'
    loop: "{{ cgroup_vars }}"
    when: item not in cmd_vars

任务的替换部分来自 Vladimir Botka 对相关问题的回答

我想改进他的示例,因为他的任务没有考虑变量是否已设置,这意味着如果我向集群服务器添加其他节点并且可以在所有节点上一遍又一遍地设置相同的变量再次运行我的剧本。

我对他的答案的第一个更改是没有将

cgroup
变量定义为任务中的项目,而是将它们移动
group_vars/all.yml
并保存在变量
cgroup_vars
中。

我正在循环遍历

cgroup_vars
中的项目,只有当循环中的当前项目 退出
cmd_vars
时才会使用该任务。

© www.soinside.com 2019 - 2024. All rights reserved.