情况
我有一些网络设备必须在网络命名空间才能访问互联网。
在我的场景中,它是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"
解决方案/问题
看来我有两个选择:
- 将所需的命令作为
command
或shell
任务运行,而不是使用单独的模块(不是最佳实践)。 - 在本地主机上运行任务(使用
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"
更多文档