【问题标题】:Hold multiple packages using Ansible使用 Ansible 保存多个包
【发布时间】:2021-11-23 19:10:07
【问题描述】:

我正在尝试使用 ansible-playbook 保存多个包,但它不适用于我。

使用下面的代码,它保存第一个包,然后解开它,然后保存第二个包

这是我的代码

- name: Prevent packages from being upgraded
  dpkg_selections:
    name: "{{ item }}"
    selection: hold
  with_items:
    - postgresql
    - docker

这是代码执行时服务器端的输出 执行前的第一行 第二行是第一个包被持有时的输出 第三行当第二个包裹被持有并停止时

我不明白为什么会有这样的行为? 以及如何使用 ansible 一次保存多个包?

注意:我已经按照 Anible 文档 https://docs.ansible.com/ansible/latest/collections/ansible/builtin/dpkg_selections_module.html 的说明进行操作 提前致谢

【问题讨论】:

    标签: linux ansible


    【解决方案1】:

    怎么样:

    - name: Prevent packages from being upgraded
      dpkg_selections:
        name: "{{ item }}"
        selection: hold
      loop:
        - postgresql
        - docker
    

    在我的例子中,执行后服务器端的输出是完整的包列表。

    【讨论】:

    • 根据 Ansible Loops 的文档,此处提供和接受的解决方案与问题中提出的非工作示例相似或相同。除了“为我工作”之外,还有其他可用信息吗?
    【解决方案2】:

    出于性能和资源原因,将包提供为列表可能会更好。

    - name: Prevent packages from being upgraded
      dpkg_selections:
        name: ['postgresql', 'docker']
        selection: hold
    

    但是,您的测试报告了

    dpkg: error: unexpected data after package and selection
    

    因此可能是模块无法处理列表,所以我查看了the sourcedpkg_selections.py。它似乎是一个简单的包装器

    module.run_command([dpkg, '--set-selections'], data="%s %s" % (name, selection), check_rc=True)
    

    只为一个模块提供信息。我还假设该模块应该可以工作with_items,但由于您的问题,情况似乎并非如此。

    根据手册页,dpkg 命令本身似乎能够处理包列表,但以字符分隔值文件的形式提供

    dpkg --set-selections < /tmp/pkg_list
    

    在格式中带有分隔符

    postgresql hold
    docker hold
    

    一个简单的解决方法可能会对您的情况有所帮助。

    - name: Prevent packages from being upgraded
      shell:
        cmd: |
          dpkg --set-selections << EOF
          postgresql hold
          docker hold
          EOF
        warn: false
        register: result
    

    您可能需要自己实现一些错误和状态处理,即

    changed_when: result.rc ...
    failed_when: result.rc ...
    

    感谢

    【讨论】:

    • 无语法错误`“msg”:“dpkg:错误:第1行打包和选择后出现意外数据”,“rc”:2,“stderr”:“dpkg:错误:意外数据后第 1 行的打包和选择\n”,“stderr_lines”:[“dpkg:错误:第 1 行打包和选择后的意外数据”],“stdout”:“”,“stdout_lines”:[]`
    • @Sara,感谢您提供测试结果,我已经相应地更新了答案。
    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2020-05-14
    • 1970-01-01
    • 2016-08-10
    • 2017-01-03
    • 2014-11-23
    相关资源
    最近更新 更多