【问题标题】:Use ansible k8s module behind a proxy在代理后面使用 ansible k8s 模块
【发布时间】:2020-02-06 03:55:14
【问题描述】:

我尝试使用 k8s 模块运行一些 ansible 任务。在本地这很完美,但在我的 Jenkins 实例上,它失败并显示以下错误消息:

...

MaxRetryError(_pool, url, error or ResponseError(原因))\nurllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='xxxxxxxxxxxxxx', 端口 = 443):最大重试次数超过 url:/版本(由 NewConnectionError(': 建立新连接失败:[Errno -2] 名称或服务未知',))\n", "module_stdout": "", "msg": "MODULE FAILURE\n查看 stdout/stderr 了解确切的错误", "rc": 1 }

我很确定这是因为 Jenkins 需要代理才能与外界通信。我已经看到如何设置 ansible 以使用代理,但这似乎不适用于 k8s 模块。有任何想法吗?到目前为止,这是我尝试过的:

 - hosts: ansible_server
   connection: local
   gather_facts: no
   environment:
    https_proxy: "xxx"
    http_proxy: "xxx"
   tasks:
    - name: Gather facts to check connectivity
      k8s_facts:
       api_key: "{{api_key}}"
       host: "{{cluster_url}}"
       kind: Project
      register: listed_projects

PS:我添加了 -vvv 标志,可以看到它试图以某种方式使用代理:

EXEC /bin/sh -c '/usr/bin/python && sleep 0' 使用模块 文件 /usr/lib/python2.7/site-packages/ansible/modules/clustering/k8s/k8s_facts.py 将 /root/.ansible/tmp/ansible-local-1fHx5f6/tmpDUhlNa 放到 /root/.ansible/tmp/ansible-tmp-1570565569.96-190678136757098/AnsiballZ_k8s_facts.py 执行 /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1570565569.96-190678136757098/ /root/.ansible/tmp/ansible-tmp-1570565569.96-190678136757098/AnsiballZ_k8s_facts.py && 睡眠 0' 执行 /bin/sh -c 'https_proxy=xxx http_proxy=xxx /usr/bin/python /root/.ansible/tmp/ansible-tmp-1570565569.96-190678136757098/AnsiballZ_k8s_facts.py && sleep 0' 执行 /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-tmp-1570565569.96-190678136757098/ > /dev/null 2>&1 && 睡眠 0'

【问题讨论】:

  • 我会关注Name or service not known 错误。似乎有些涉及的主机无法解析提到的主机?

标签: bash kubernetes proxy ansible


【解决方案1】:

我同意@ilias-sp 但似乎k8s/common.py 不支持configuration.proxy attribute, 并且尽我所能告诉urllib3 不像“正常” urllib 那样尊重那些代理环境变量,而是选择使用由显式构造函数 kwarg 驱动的自己的 ProxyManager

不过,感谢ansible的“override”机制,相信你可以检验一下这个理论:

  1. k8s_facts.py 复制到 playbook 的 library 文件夹中
  2. 修改它以在AUTH_ARG_MAP 中公开proxy,我相信下面的补丁可以做到(该补丁针对v2.8.5,因此如果您的版本不同,您可能需要修改它)
  3. 在新的k8s_facts 模块上显式设置proxy: 属性,看看它是否有效

    - k8s_facts:
        host: api-server-whatever
        kind: Project
        proxy: http://my-proxy:3128
    
  4. 假设是,open an issue in ansible 让他们知道
--- a/library/k8s_facts.py  2019-10-08 22:23:24.000000000 -0700
+++ b/library/k8s_facts.py  2019-10-08 22:24:50.000000000 -0700
@@ -130,13 +130,14 @@
 '''


-from ansible.module_utils.k8s.common import KubernetesAnsibleModule, AUTH_ARG_SPEC
+from ansible.module_utils.k8s.common import KubernetesAnsibleModule, AUTH_ARG_SPEC, AUTH_ARG_MAP
 import copy


 class KubernetesFactsModule(KubernetesAnsibleModule):

     def __init__(self, *args, **kwargs):
+        AUTH_ARG_MAP['proxy'] = 'proxy'
         KubernetesAnsibleModule.__init__(self, *args,
                                          supports_check_mode=True,
                                          **kwargs)
@@ -163,6 +164,7 @@
                 namespace=dict(),
                 label_selectors=dict(type='list', default=[]),
                 field_selectors=dict(type='list', default=[]),
+                proxy=dict(type='str', required=False),
             )
         )
         return args

【讨论】:

  • 哇,非常感谢您的详尽回答。我按照建议应用了补丁,现在可以使用了。我将按照您的建议创建问题。非常感谢。
  • 还有一件事,你能帮我为“普通”k8s 模块实现同样的功能吗?我试过了,但我的 Python 技能太有限,无法在足够的时间内完成此操作
  • 抱歉,您必须与 ansible 人员一起解决问题,或者使用“出租编码器”服务来为您解决 Python 问题
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 2023-03-24
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2023-02-08
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多