代码之家  ›  专栏  ›  技术社区  ›  user6866797

Docker找不到所需的可执行文件“%s”

  •  0
  • user6866797  · 技术社区  · 4 月前

    我想做的是:

    • 创建一个docker镜像,这样我就可以使用docker运行playbook了。

    我的问题是:

    • Ansible找不到我在剧本中使用的Ansible.posix.synchronize模块的可执行文件。注意,我已通过运行确认该模块存在 ansible星系收藏列表

    错误:

    <10.16.29.75> EXEC /bin/sh -c '/usr/bin/python3 /root/.ansible/tmp/ansible-local-1d52bc7yn/ansible-tmp-1738185054.6606917-31-140162884904275/AnsiballZ_synchronize.py && sleep 0'
    marios_spaghetti  | <10.16.29.75> EXEC /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-local-1d52bc7yn/ansible-tmp-1738185054.6606917-31-140162884904275/ > /dev/null 2>&1 && sleep 0'
    marios_spaghetti  | The full traceback is:
    marios_spaghetti  |   File "/tmp/ansible_ansible.posix.synchronize_payload__jvn6z1c/ansible_ansible.posix.synchronize_payload.zip/ansible/module_utils/basic.py", line 1421, in get_bin_path
    marios_spaghetti  |     bin_path = get_bin_path(arg=arg, opt_dirs=opt_dirs)
    marios_spaghetti  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    marios_spaghetti  |   File "/tmp/ansible_ansible.posix.synchronize_payload__jvn6z1c/ansible_ansible.posix.synchronize_payload.zip/ansible/module_utils/common/process.py", line 44, in get_bin_path
    marios_spaghetti  |     raise ValueError('Failed to find required executable "%s" in paths: %s' % (arg, os.pathsep.join(paths)))
    marios_spaghetti  | fatal: [airflowdev]: FAILED! => {
    marios_spaghetti  |     "changed": false,
    marios_spaghetti  |     "invocation": {
    marios_spaghetti  |         "module_args": {
    marios_spaghetti  |             "_local_rsync_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
    marios_spaghetti  |             "_local_rsync_path": "rsync",
    marios_spaghetti  |             "_substitute_controller": false,
    marios_spaghetti  |             "archive": true,
    marios_spaghetti  |             "checksum": false,
    marios_spaghetti  |             "compress": true,
    marios_spaghetti  |             "copy_links": false,
    marios_spaghetti  |             "delay_updates": true,
    marios_spaghetti  |             "delete": true,
    marios_spaghetti  |             "dest": "[email protected]:/home/infogrid/cp_test_ansible",
    marios_spaghetti  |             "dest_port": null,
    marios_spaghetti  |             "dirs": false,
    marios_spaghetti  |             "existing_only": false,
    marios_spaghetti  |             "group": null,
    marios_spaghetti  |             "link_dest": null,
    marios_spaghetti  |             "links": null,
    marios_spaghetti  |             "mode": "push",
    marios_spaghetti  |             "owner": null,
    marios_spaghetti  |             "partial": false,
    marios_spaghetti  |             "perms": null,
    marios_spaghetti  |             "private_key": null,
    marios_spaghetti  |             "recursive": true,
    marios_spaghetti  |             "rsync_opts": [],
    marios_spaghetti  |             "rsync_path": null,
    marios_spaghetti  |             "rsync_timeout": 0,
    marios_spaghetti  |             "set_remote_user": true,
    marios_spaghetti  |             "src": "/fake_dags",
    marios_spaghetti  |             "ssh_args": null,
    marios_spaghetti  |             "ssh_connection_multiplexing": false,
    marios_spaghetti  |             "times": null,
    marios_spaghetti  |             "verify_host": false
    marios_spaghetti  |         }
    marios_spaghetti  |     },
    marios_spaghetti  |     "msg": "Failed to find required executable \"rsync\" in paths: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    marios_spaghetti  | }
    

    下面是我的docker镜像的定义:

    FROM ubuntu:latest
    
    RUN apt-get update
    
    RUN apt-get install -y python3
    
    RUN apt-get install -y python3-pip
    
    RUN apt install -y openssh-client
    
    RUN apt install -y sshpass
    
    RUN apt install -y python3 ansible
    
    
    here is how my playbook is configured:
    
    - name: fakedagdeployment
      hosts: airflowdev
      become: true
      tasks:
        - name: deploy fake dags
          ansible.posix.synchronize:
            src:  /fake_dags
            dest: /home/infogrid/cp_test_ansible
            delete: true
            recursive: true
    
    here is my docker compose file:
    
    services:
      ansible_poc:
        container_name: marios_spaghetti
        environment:
          ANSIBLE_HOST_KEY_CHECKING: False
        image: ansible-poc
        command: ansible-playbook -vvv -i ./inventory/hosts.yml --user infogrid ./playbooks/fakedagdeploy.yml
        volumes:
          - ./fake_dags:/fake_dags
          - ./inventory:/inventory
          - ./playbooks:/playbooks
    
    Thank you for your help!
    
    2 回复  |  直到 4 月前
        1
  •  1
  •   Alexander Pletnev    4 月前

    我已通过运行确认该模块存在 ansible-galaxy collection list

    一个可靠的人 模块 可以存在,但这并不意味着它 外部的 依赖项已安装。

    ansible.posix.synchronize 文档:

    rsync 必须同时安装在本地和远程主机上。

        2
  •  -1
  •   user6866797    4 月前

    我假设rsync是作为基本ubuntu映像的一部分安装的,但事实并非如此,我通过在映像代码中添加此行来解决了这个问题

    RUN apt-get安装-y rsync