如何用 golang 开发 ansible 的 filter 插件

问题描述

如何用 golang 开发 ansible 的 filter 插件?
模块可以用 go 开发,filter 插件不知道是否行的通。

问题出现的平台版本及自己尝试过哪些方法

python 在处理单双引号时老是出问题,因此打算用 golang 处理。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
python 版本

def single_double(a_list):
    new_list = [ '%s' % an_element for an_element in a_list]
    #return '"%s"' % new_list
    return new_list

class FilterModule(object):
    def filters(self):
        return {'single_double': single_double}

你期待的结果是什么?实际看到的错误信息又是什么?

使用 golang 开发 ansible 的 filter 插件可以提供一些示例代码

阅读 3.6k
1 个回答

经过尝试,使用 python 可以实现。
前面的做法 filter 返回的是 python 的list,并不能直接作为数组使用,需要将其转化为字符串,再返回就 OK 了。

原因:对 python 的数据结构理解不够

实现如下:

def to_join_http_port(nodes, hostvars, ansible_default_netname, port):
    """
    INPUT:
        nodes: groups.group_name
        hostsvars: ansible Built-in vars
        ansible_default_netname: ethernet name
        port: program server port
    RETURN:
        string like '"http://10.32.254.7:8081","http://10.32.254.8:8081","http://10.32.254.11:8081"'
    """
    ips = []
    for node in nodes:
        ips.append(hostvars[node][ansible_default_netname]["ipv4"]["address"])
    return ",".join([ '"http://%s:%s"' % (ip, port) for ip in ips ])


class FilterModule(object):
    def filters(self):
        return {
            'http_port_join': to_join_http_port
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题