需要对 Ansible 文档中的示例进行澄清

需要对 Ansible 文档中的示例进行澄清

lxd_container模块Ansible 2.5 包含以下示例:

# An example for creating a Ubuntu container and install python
- hosts: localhost
  connection: local
  tasks:
    - name: Create a started container
      lxd_container:
        name: mycontainer
        state: started
        source:
          type: image
          mode: pull
          server: https://images.linuxcontainers.org
          protocol: lxd
          alias: ubuntu/xenial/amd64
        profiles: ["default"]
        wait_for_ipv4_addresses: true
        timeout: 600

    - name: check python is installed in container
      delegate_to: mycontainer
      raw: dpkg -s python
      register: python_install_check
      failed_when: python_install_check.rc not in [0, 1]
      changed_when: false

    - name: install python in container
      delegate_to: mycontainer
      raw: apt-get install -y python
      when: python_install_check.rc == 1

谁能向我解释一下为什么这个例子使用raw模块而不是apt模块

这是这里使用的某种内部知识吗?(过早?)基于ansible_connection=lxdansible_connection=sshformycontainer或其他什么东西来优化 Ansible 的性能?

毕竟,处理最后两项任务要简单得多:

- name: install python in container
  delegate_to: mycontainer
  apt: pkg=python state=latest

...当然可以选择更新 apt 缓存等等。

那么为什么要在这里使用该raw模块呢?

注意:我问这个主要是因为文档通常显示了规范的做事方式。但根据我的理解,规范地我应该使用特定的模块,例如apt而不是调用shellraw命令。

答案1

同时我找到了原因。

所以 Ansible 会通常情况下生成一个 Python (2.x) 脚本,通过为任何特定主机配置的任何连接方法在远程计算机上执行。

唉,Python 是该模块的先决条件apt。该raw模块似乎没有此限制,因此可用于安装在(远程)主机上运行 Ansible 任务所需的先决条件,直接在远程系统上使用dpkg和命令。apt-get顺便说一下,shell模块有同样的限制,但raw模块没有。不过,我希望在文档中更明确地提到这一点。

在这种情况下,结果字典包含一个名为module_stderr以下值的键:module_stderr": "/bin/sh: 1: /usr/bin/python: not found\n。通过在调用时增加详细程度使其可见ansible-playbook

现在我知道发生了什么,raw模块文档中的这句话就更有意义了:

该模块不需要远程系统上的 python,就像脚本模块。

我之前没有发现这一点,因为我正在增量运行我的剧本,所以python当我心想“为什么不使用该apt模块?”时,该软件包已经安装了。

相关内容