Esclarecimento sobre o exemplo da documentação Ansible necessária

2

O % módulolxd_container do Ansible 2.5 contém este exemplo:

# 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

Alguém poderia me explicar por que o exemplo usa o raw module do % móduloapt ?

Isso é algum tipo de conhecimento interno que foi usado aqui e (prematuramente?) otimiza o desempenho da Ansible, com base no ansible_connection=lxd versus ansible_connection=ssh para mycontainer ou algo assim?

Afinal, é muito mais fácil descartar essas duas últimas tarefas em favor de:

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

... claro, com a opção de atualizar o cache do apt e tudo mais.

Então, por que recorrer ao módulo raw aqui?

NB: Eu estou perguntando isso principalmente porque geralmente a documentação mostra a maneira canônica de fazer as coisas. Mas pelo que entendi, canonicamente devo usar os módulos específicos, como apt , em vez de invocar os comandos shell ou raw .

    
por 0xC0000022L 16.04.2018 / 23:12

1 resposta

1

Enquanto isso, encontrei o motivo.

So Ansible irá normalmente gerar um script em Python (2.x) para ser executado na máquina remota através de qualquer método de conexão configurado para qualquer host em particular.

Infelizmente, o Python é um pré-requisito do módulo apt . O módulo raw não parece ter essa limitação e, portanto, pode ser usado para instalar os pré-requisitos necessários para executar tarefas Ansible nos hosts (remotos), usando os comandos dpkg e apt-get diretamente no sistema remoto. By the way, o módulo shell tem a mesma limitação, mas o módulo raw não. Eu gostaria que isso fosse mencionado um pouco mais explicitamente na documentação.

Nesse caso, o dicionário de resultados contém uma chave chamada module_stderr com o seguinte valor: module_stderr": "/bin/sh: 1: /usr/bin/python: not found\n . Torne visível, aumentando a verbosidade ao invocar ansible-playbook .

Agora que eu sei o que está acontecendo, essa frase da documentação do módulo raw faz muito mais sentido:

This module does not require python on the remote system, much like the script module.

Eu não encontrei isso antes, porque estava executando meu manual de forma incremental, então o pacote python já estava instalado quando pensei comigo mesmo "por que não usar o módulo apt ?"

    
por 17.04.2018 / 23:38

Tags