ansible剧本编写_如何为Ansible编写安全集成模块

ansible剧本编写

Ansible是一个非常简单的IT自动化平台 ,使您的应用程序和系统更易于部署。 它使您避免编写脚本或自定义代码来部署和更新应用程序,系统以及网络连接设备的各种分类。 Ansible允许您以一种接近普通英语的语言实现自动化,无需代理即可安装在远程系统上,并使用基于设备类型的本机协议,例如Unix风格操作系统的SSH,Windows系统WinRM的REST API( httpapi ) REST API设备等等。

背景

在AnsibleFest 2019上 ,我和我的同事Sumit Jaiswal进行了主题为“ Ansible开发的深入探讨:如何为Ansible编写安全集成模块和集合”的演讲 ,这是我们一直在努力的事情。 本文概述了我们演讲的重点; 我希望它能凸显Ansible在信息安全自动化领域中的潜力,并且能够胜任。

Massimo Ferrari的声明说:“ Ansible自动化可以成为集成和编排分布在不同域中的许多安全平台的通用语言 。” 我们花了很多时间来考虑这个问题。 对于发现Ansible强大功能的DevOps和自动化专业人士来说,这可能是显而易见的,但是infosec没有类似的工具以相同的方式解决行业问题。 因此,法拉利的声明为信息安全行业提供了巨大的潜力。

在本文中,我将总结我们在AnsbileFest 2019演讲中强调的两个要点:

  • 推荐的开发实践
  • 分类您要与之集成的对象以及与它的连接方式(API或CLI?)

Ansible工程团队喜欢永远不要写“最佳实践”一词,因为我们可能无法知道在您的特定情况下最适合您的方法。 您是适用于您独特的环境和要求的主题专家。 但是,我们可以提供建议 ,我将从Ansible模块开发人员的角度概述这些建议

模组

模块以用户为中心并且是独立的。 这主要意味着模块中包含的代码应独立包含在模块内或module_util中 后者使我们能够在模块之间共享代码,但是所有内容都必须尽可能独立,因为我们不想引入过多的外部依赖关系。 我们还希望每个模块执行某种状态管理。 每个模块都应该是幂等的 ,这基本上意味着“如果需要,则进行更改,否则,则不要。” 模块不应尝试包含工作流程(这是剧本的用途),我们希望将其留给用户。 模块不应尝试“做太多”,以使您拥有一个庞大的模块,该模块接受100个参数,并根据用户提供的值在目标设备上执行完全不同的操作。

我们通常想要避免的一个例子可能是这样的:


     
     
     
     
- name : Create a virtual machine
  some_module
:
    thing_to_do
: "create_virtual_machine"
    name
: "bobs_awesome_vm"
    storage_size
: 100G
    ram
: 24G
    vcpus
: 4

- name
: Create a virtual storage volume
  some_module
:
    thing_to_do
: "create_virtual_storage_vol"
    name
: "bobs_awesome_storage"
    storage_size
: 1000G
    lun_id
: 12

在此示例中,虚拟的some_module基于Thing_to_do的值执行了完全脱节的动作。 从Ansible模块的角度来看,这不是一个独立的独立工作单元。 这些应该是两个单独的模块,甚至可以通过自定义的module_util在后端共享代码(如果这样可以简化开发人员的工作)。 无论哪种方式,它们都应该是单独的模块,以便用户可以轻松地定义,阅读和理解所编写的任务。 作为开发人员,您希望使模块的交互以用户为中心。

以用户为中心的另一个方面是,用户不必为了有效使用模块就不需要任何有关目标API的知识。 该模块应提供有用的默认值,文档和示例,以允许用户选择自己的自动化路径。

馆藏

Ansible系列是一个相对较新的概念,但通常被视为各种形状和大小的Ansible内容的未来。 它们允许Ansible内容作为一个有凝聚力的单元存在,以作为一个实体进行测试,验证和分发,例如模块,module_utils,各种插件,角色,文档,测试,剧本以及社区接下来想要做的任何事情。 更重要的是(这对开发人员来说是它的真正优势)是它使内容与Ansible Core运行时解耦。 这使得可以将Ansible内容与Ansible本身分开进行生命周期管理,这意味着可以按内容作者或维护者的意愿频繁或不频繁地发布它。 新功能将不再需要等待六个月才能发布下一个Ansible版本。 收藏集的作者可以根据需要随意发布。

收集意味着可以简单地进入勇敢的新世界,Ansible Core执行引擎在符号上与CPython类似。 Ansible集合在符号上类似于PyPI上的Python模块。 Ansible Galaxy在符号上与PyPI类似,因为它实际上是一种发行机制。

从开发人员的角度来看,您只需要将文件放在正确的位置并更新任何自定义的module_utils Python导入路径即可。 从用户角度来看,您只需要将集合名称空间和名称添加到打算使用该内容的播放或块中。

分类您要集成的内容以及连接方式

在安全领域中,有时会像设备一样使用的设备设备或软件(网络设备,嵌入式系统等)向管理员显示应用程序编程接口 (API)和命令行界面 (CLI) 。 作为模块开发人员,您必须在易于开发,代码的可维护性以及最终一致的用户体验方面做出一些决策。

命令行界面

如果您可能要打包CLI,请问自己该CLI是否提供了一个可以合理,一致地解析输出的一致接口。 除此之外,CLI是否提供制定幂等交易的功能? 尽管大多数CLI提供了获取设置事务类型(尤其是在Unix / Linux系统上),但是其中一些却没有,这是模块作者需要考虑的事情。

考虑使用具有标准CLI但不提供传统Unix Shell的网络或嵌入式设备执行CLI时,应考虑实现cliconf插件 。 这种类型的插件使您的用户可以与经验丰富的Ansible用户和初学者一样自然地与设备或嵌入式设备进行交互。 另外,如果您发现自己拥有允许执行本地Python代码的设备(对于设备或系统本身是本地的;在Ansible术语中为“托管主机”),那么请考虑run_command module_util。 后一种情况实际上只是传统的模块开发工作流程,就像传统的GNU / Linux发行版一样。

API

如果您尝试与之集成的技术提供了API,请确定该API是本地系统上API(对于远程“托管主机”系统而言是本地)还是远程API(例如REST API)?

如果您发现自己使用本地Python API,并且使用它代替REST API(如果两者都可用)是有利的,那么这种情况实际上与GNU / Linux发行版中的传统模块开发工作流程相同。

但是,如果唯一的选择是REST API,或者如果确定可用的REST API是最佳选择,则编写httpapi连接插件最适合实现,维护和处理AuthN,AuthZ,会话之类的一般操作。 , 等等。 即使与Ansible所使用的大多数其他设备相比,它们具有非常不同的通信方式,它也为与这些类型的设备通话提供了惯用模式。

对于使用不提供httpapi连接插件的模块使Web服务自动化的任何人,可能都有一个示例来说明这一点。 通常,在这些情况下,必须针对localhost运行播放,块或任务,并且必须将与Web服务连接的各种信息传递给每个任务的模块的每次调用。


     
     
     
     
---
- name
: talk to foo device
  hosts
: localhost
  tasks
:
    - name
: do something
      foo_device_do_thing
:
        url
: foo.example.com
        username
: "{{ foo_device_username }}"
        passwd
: "{{ foo_device_password }}"
        validate_certs
: true
        thing_state
: present
        some_param
: bar

如果该模块是针对httpapi连接插件实现的,则各种特定于连接的参数将是主机变量或组变量,并且不必在剧本的任务级别上随身携带。

这是一个清单条目,用于处理针对所有Ansible模块的AuthN / AuthZ连接,是针对httpapi连接插件编写的。 它还执行会话处理以提高性能:


     
     
     
     
[ foo_devices ]
foo.example.com

[ foo_devices:vars ]
ansible_network_os = foo_device
ansible_user = foo_device_username
ansible_httpapi_pass = foo_device_password
ansible_httpapi_validate_certs = true

这本剧本会更加惯用。 foo_devices是剧本的一流设备类型和主机模式 。


     
     
     
     
---
- name
: talk to foo device
  hosts
: foo_devices
  tasks
:
    - name
: do something
      foo_device_do_thing
:
        thing_state
: present
        some_param
: bar

一本剧本必须为每个任务定义信息,因此请想象一本有20或100个任务的剧本。 开销将是可观的。 这不像直接自动化host字段中定义的主机那样。 但是,httpapi连接插件不需要一遍又一遍地定义连接信息,它也可以通过REST API与设备进行本地通讯,就像在Linux系统中通过SSH在剧本中一样。

关于httpapi连接插件的注意事项是,即使用户定义了主机,组,主机变量和组变量,就像在传统的Unix / Linux或Windows管理的主机中一样,这些模块实际上还是针对本地主机执行的(控制主机”)。 开发时要牢记这一点。

什么啊

如果您是Ansible模块开发的新手,那么似乎很容易一次接触到很多东西。 公平地说,是这样。 但是,随着您对各种设备类型和技术解决方案分类的Ansible模块开发的精要点越来越熟悉,采用不同开发策略的动机就变得有意义了。 某些设备分类具有特质,该模型可帮助Ansible开发人员和用户以一致且可预测的方式处理这些问题。

结语

如果您对Ansible模块开发模型有疑问,请随时通过充满活力的Ansible社区 ,更具体地说,是Ansible Security Automation工作组与我们联系 。

翻译自: https://opensource.com/article/19/12/security-ansible-module

ansible剧本编写

你可能感兴趣的:(ansible剧本编写_如何为Ansible编写安全集成模块)