这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=lxd
与ansible_connection=ssh
formycontainer
或其他什么东西来优化 Ansible 的性能?
毕竟,处理最后两项任务要简单得多:
- name: install python in container
delegate_to: mycontainer
apt: pkg=python state=latest
...当然可以选择更新 apt 缓存等等。
那么为什么要在这里使用该raw
模块呢?
注意:我问这个主要是因为文档通常显示了规范的做事方式。但根据我的理解,规范地我应该使用特定的模块,例如apt
而不是调用shell
或raw
命令。
答案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
模块?”时,该软件包已经安装了。