- name: Installed packages.
  ansible.builtin.shell:
    cmd: apt list --installed | cut -d'/' -f1 | uniq
  register: installed_packages

- name: Install packages.
  ansible.builtin.apt:
    name: "{{ item }}"
    state: present
  when: 'item | string not in installed_packages.stdout'
  loop:
    - 7zip
    - acl

我有上述任务。除了“string”匹配部分包名外,运行良好。这意味着如果我想安装“acl”包,它会被跳过,因为“libacl1”已安装。我需要它匹配整个包名,并且只匹配整个包名。

有什么办法可以做到这一点?

4

  • 使用该有什么问题?


    – 

  • 2
    而且检查本身基本上没用。只需说明要安装哪些软件包,Ansible 只会在尚未安装时安装它们。


    – 

  • 包事实模块成功了!


    – 

  • 检查仍然毫无用处。你只是重复了模块apt已经完成的工作。现在,如果软件包已安装,则会检查两次。


    – 


最佳答案
1

删除单独的检查步骤。包模块处于所需状态,并且仅根据其输入参数执行必要的操作。

删除循环。大多数包模块可以在一个事务中安装一个列表,这样速度更快。列表可以是任务中的静态列表,也可以是变量表达式。

- name: Install packages.
  ansible.builtin.apt:
    name: 
    - 7zip
    - acl
    state: present