在网络命名空间内运行 Ansible 任务(例如:get_url)

在网络命名空间内运行 Ansible 任务(例如:get_url)

情况

我有一些网络设备必须在网络命名空间才能访问互联网。

在我的场景中,它是mgmt命名空间。

例如,要安装 pip 包,我会执行以下操作:

sudo ip netns exec ns-mgmt pip3 install boto3

或者要使用 wget 获取文件,我需要执行以下操作:

sudo ip netns exec ns-mgmt wget https://example.com

问题

因此,需要访问互联网的常规 Ansible 命令不起作用:

- name: "download file archive"
  get_url:
    url: "{{ my_dl_path }}"
    dest: "/tmp/downloaded_file.tar.gz"

解决方案/问题

看来我有两个选择:

  • 将所需的命令作为commandshell任务运行,而不是使用单独的模块(不是最佳实践)。
  • 在本地主机上运行任务(使用delegate_to)并复制文件。这对于简单的事情来说没问题,wget例如get_url 模块,但对于诸如pip 模块从互联网安装东西时。

您将如何解决这个问题?是否有某种 Ansible 任务覆盖来处理这种情况?

答案1

关于

是否有某种 Ansible 任务覆盖来处理这种情况?

是的,有。这取决于你如何看待它,这很简单。解决方案在于成为插件

关于

您将如何解决这个问题?

(1)你可以创建自己的定制成为插件基于现有的ansible/plugins/become/sudo.py,意味着只需用额外的方法对其进行调整'ip netns exec %s' % (become_network_namespace)

在创建并提供自定义的 become 插件后,例如名为 as sudo_ns.py,可以使用特权升级并引入一个新的become_network_namespace事实

- name: "download file archive"
  become: true
  become_method: sudo_ns
  get_url:
    url: "{{ my_dl_path }}"
    dest: "/tmp/downloaded_file.tar.gz"
  vars:
    become_network_namespace: 'ns-mgmt' 

(2)sudo您可以尝试使用现有的成为插件和测试快捷方式become_flags

- name: "download file archive"
  become: true
  become_method: sudo
  become_flags: 'ip netns exec {{ BECOME_NETWORK_NAMESPACE }}'
  get_url:
    url: "{{ my_dl_path }}"
    dest: "/tmp/downloaded_file.tar.gz"

更多文档

相关内容