【问题标题】:Ansible Error: "[Errno 2] No such file or directory"Ansible 错误:“[Errno 2] 没有这样的文件或目录”
【发布时间】:2020-05-01 04:12:34
【问题描述】:

我无法在 ansible 命令模块中执行 kubectl(v1.16.3) 命令。

例如使用 ansible 创建命名空间。

任务: - 名称:“创建目录” 文件: 路径:~/ansible_ns/demo_namespaces 状态:目录 - 名称:“创建命名空间(1/2)” 复制: 内容:“apiVersion:v1 \nkind:命名空间 \nmetadata:\n 名称:{{item}}” 目标:“~/ansible_ns/demo_namespaces/{{item}}.yml” with_items: -“{{命名空间}}” - 名称:“创建命名空间(2/2)” 命令:“kubectl create -f {{item}}.yml --kubeconfig=/var/lib/kubernetes/kubeconfig.yaml” 参数: chdir: ~/ansible_ns/demo_namespaces/ 忽略错误:真 with_items: -“{{命名空间}}”

我最终遇到以下错误:

(项目=ns) => { “ansible_loop_var”:“项目”, “改变”:错误, "cmd": "kubectl create -f ns.yml --kubeconfig=/var/lib/kubernetes/kubeconfig.yaml", “调用”:{ “模块参数”:{ "_raw_params": "kubectl create -f ns.yml --kubeconfig=/var/lib/kubernetes/kubeconfig.yaml", “_uses_shell”:假, “argv”:空, "chdir": "/root/ansible_ns/demo_namespaces/", “创建”:空, “可执行”:空, “删除”:空, “标准输入”:空, “stdin_add_newline”:是的, “strip_empty_ends”:是的, “警告”:真 } }, “项目”:“ns”, "msg": "[Errno 2] 没有这样的文件或目录", “rc”:2 }

注意:但我可以手动执行“kubectl create -f ..”。它正在创建东西。

我的 Ansible 版本:

$ ansible --version
ansible 2.9.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/mdupaguntla/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

仅供参考,我也尝试过使用 Ansible - 2.4.2。但没有运气。

我的系统操作系统:CentOS 7

我的查询:

  1. 在我的上下文中,这个错误是什么意思“[Errno 2] 没有这样的文件或目录”?

  2. 我了解到 Ansible 引入了 kubectl & k8s 模块:社区中是否有人在使用这些模块。如果是,请告诉我如何使用它们。如果他们有任何先决条件 - 请分享 对于 kubectl 模块:开始知道先决条件是 kubectl go library.May 我知道我在哪里可以 获取此库。

  3. 当 kubectl 版本为 1.8 且 ansible 版本为 2.4.2 - 我能够使用命令模块获取使用“kubectl create -f ...”创建的 K8s 资源。但是当我将集群从 v1.8 升级到 v1.16.3 时 - 我无法使用命令模块使用“kubectl create -f ...”创建资源。如果我错过了做事,请告诉我。

提前感谢社区

【问题讨论】:

  • 在命令前提供 kubectl 的路径或尝试使用 shell 命令或尝试给出 become: true
  • 1.如果我使用 shell 模块。我收到“/bin/sh: kubectl: command not found”。 2. 我已经使用了下面的东西 become: true become_method: sudo become_user: root 3. “在命令之前提供 kubectl 的路径” - 比如? - 有什么例子吗?
  • 我的意思是 kubectl 的路径。 command: "/the/path/kubectl create -f {{item}}.yml.kubectl所在的路径
  • @smily - 它正在工作.. 非常感谢......但是为什么我应该将 kubectl 的路径放在命令中。有什么解决方法吗?

标签: kubernetes ansible


【解决方案1】:

你必须在命令模块中添加 kubectl 的路径。

command: "/the/path/kubectl create -f {{item}}.yml .........."

这是因为 $PATH 没有用 kubectl 的路径更新。您也可以将路径添加到 $PATH,而不是在命令模块中提供路径。

【讨论】:

  • 我的 Kubectl 位于路径 /usr/local/bin echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 仅供参考,$PATH 中已经存在 kubectl 路径
  • 可能是特定用户的路径变量没有为此设置 $PATH。尝试从 Ansible 回显 $PATH 以验证
  • shell: "echo $PATH"
  • 通过 Ansible 输出 echo $PATH:"stdout_lines": ["/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:........."]。它有 /usr/local/bin。
  • 哦,对不起,这是我的理解,但我希望提供路径可以解决您的问题
【解决方案2】:

如果你使用 ansible 2.9.2,它有 k8s 模块可用。它提供了完全声明式的方法(与发出命令式命令相比),这更类似于您在 Kubernetes 本身中可以找到的方法。

例如,如果你想创建一个新的命名空间,只需使用:

- name: Create a k8s namespace
  k8s:
    name: testing
    api_version: v1
    kind: Namespace
    state: present

你不得不承认它看起来要简单得多。

【讨论】:

  • 使用 k8s 模块时:我收到此错误“无法在 abc059.xyz.local(我的 VM 的主机名)Python /usr/bin/python 上导入所需的 Python 库(openshift)。请阅读模块文档并安装在适当的位置。如果安装了所需的库,但 Ansible 使用了错误的 Python 解释器,请查阅有关 ansible_python_interpreter 的文档。是否需要在路径 /usr/bin/python 上显式安装 openshift?- 我是新手
  • 您的 python interpreter 需要额外的库 openshift ( pypi.org/project/openshift ) 才能处理 k8s 模块所需的操作。安装它的最简单方法是使用您的 python 包管理器pip。你只需要运行这个命令:pip install openshift.
  • 我从 smily 那里得到了解决方案。我将使用该解决方案,因为我必须对我的源代码进行最小的更改。改天我也会尝试使用 k8s 模块,并会告诉你.. 也非常感谢你的帮助..
  • 我完全理解您可能更喜欢使用您当前的解决方案,因为它的准备工作需要大量的时间和精力,而且实际上已经准备就绪。但是,请记住,这不是一个非常灵活的解决方案。请注意,Ansibleshellcommand 模块的存在是一种解决方法,可以解决现有模块无法正确完成的事情。在 playbook 中运行命令式命令与 idempotency 的理念相反,这是 Ansible 中的核心概念之一。
【解决方案3】:

嗯,有两种方法可以让这个过程变得更好和更实用。

你可以尝试像这样使用k8s模块。

- name: Create k8s catota namespace
  k8s:
    name: catota
    api_version: v1
    kind: Namespace
    state: present

或者您也可以使用shell 模块:

- name: Create k8s catota namespace
  shell: "kubectl create namespace catota"
  args:
    executable: /bin/bash

【讨论】:

  • 如果我使用 shell 模块。我收到“/bin/sh: kubectl: command not found”
  • 使用 k8s 模块时:我收到此错误“无法在 abc059.xyz.local(我的 VM 的主机名)Python /usr/bin/python 上导入所需的 Python 库(openshift)。请阅读模块文档并安装在适当的位置。如果安装了所需的库,但 Ansible 使用了错误的 Python 解释器,请查阅有关 ansible_python_interpreter 的文档。是否需要在路径 /usr/bin/python 上显式安装 openshift?- 我是新手。
  • 似乎很多人都面临与您相同的错误。在 GitHub 上寻找一些问题时,我遇到了一个可能对您有帮助的问题:github.com/ansible/ansible/issues/50529#issuecomment-451340890。关于 shell 模块,看起来您的 kubectl 没有添加到 $PATH 以便 /bin/sh 使用它。你能在你打算运行这些 ansible 命令的主机上手动执行kubectl create ns namespace-name 吗?
  • shell 模块默认使用 /bin/sh 来运行命令。尝试设置 bash shell。我编辑了我的答案,请查看。
【解决方案4】:

解决此问题

错误:

(item=ns) => {
    "ansible_loop_var": "item",
    "changed": false,
    "cmd": "kubectl create -f ns.yml --kubeconfig=/var/lib/kubernetes/kubeconfig.yaml",
    "invocation": {
        "module_args": {
            "_raw_params": "kubectl create -f ns.yml --kubeconfig=/var/lib/kubernetes/kubeconfig.yaml",
            "_uses_shell": false,
            "argv": null,
            "chdir": "/root/ansible_ns/demo_namespaces/",
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "stdin_add_newline": true,
            "strip_empty_ends": true,
            "warn": true
        }
    },
    "item": "ns",
    "msg": "[Errno 2] No such file or directory",
    "rc": 2
}

首先,请注意这是"_uses_shell": false,。这是因为它使用的是Command 而不是shell。这也是伪装错误代码。如果我们切换到shell 并重新运行,我们会得到:

    "msg": "non-zero return code",
    "rc": 127,
    "start": "2021-09-03 13:48:12.184639",
    "stderr": "/bin/bash: <PROGRAM>: command not found",

(退出代码的详细信息https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html

/bin/bash 是赠品。执行which kubectl 可能会得到类似/usr/local/bin/kubectl 的信息。

您要么需要更新 ansible 命令以使用 /usr/local/bin/kubectl,要么更新 /bin/bash/ 的 $PATH 以找到它。

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多