我们希望听到您的声音!帮助我们深入了解 Ansible 生态系统现状。
参与 2024 年 Ansible 项目调查

号角 #7

Ansible Bullhorn banner

号角

Ansible 开发者社区通讯

欢迎阅读号角,这是我们面向 Ansible 开发者社区的通讯。如果您有任何问题或想要分享的内容,请发送电子邮件至 [email protected]
 

ANSIBLE 2.10.0 ALPHA 6 现已推出

Ansible 社区团队于 7 月 28 日宣布推出 Ansible 2.10.0 Alpha 6。此新 Ansible 软件包应可作为 Ansible 2.9 的直接替换,您当前使用的角色和剧本应可与 ansible-2.10.0 alpha6 兼容。有关如何下载、测试和报告问题的更多信息,请阅读Toshio Kuratomi 在 ansible-devel 邮件列表中发布的公告
 

ANSIBLE-BASE 2.10.0 发布候选版本 3 现已推出

Ansible Base 团队于 7 月 24 日宣布推出 Ansible 2.10.0 RC 3 预发布版本。此 ansible-base 软件包仅包含 Ansible 执行引擎、相关工具(例如 ansible-galaxy、ansible-test)以及极少数内置插件,并且也捆绑在较大的 Ansible 发行版中。有关如何下载、测试和报告问题的更多信息,请阅读Rick Elrod 在 ansible-devel 邮件列表中发布的公告
 

模块文档现已可用

经过数月的努力,我们已在docs.ansible.com上恢复了模块级文档!这项工作需要 Ansible 文档团队与社区团队和开发人员之间的协调,以便从 Galaxy 上的集合中提取模块文档,并再次在我们的文档网站上发布。有关更多信息,请阅读Sandra McCann 在 ansible-devel 邮件列表中发布的公告
 

ANSIBLE 统计数据更新

正如 Greg Sutcliffe 在其最近的推文中承诺的那样,他详细介绍了上一期号角中气泡图所代表的内容,回答了许多关于图细节的问题,并探讨了此类图形的可能用途。
 

来自 Ansible 社区的内容

 

ANSIBLE 线上聚会

下个月 Ansible 社区将举办以下线上聚会

Ansible NOVA 八月会议
8 月 12 日(星期三)下午 4:00 EDT
https://www.meetup.com/Ansible-NOVA/events/271964842/

Ansible 新西兰:构建无状态自配置 Ansible 集群
8 月 13 日(星期四)中午 12:00 GMT+12
https://www.meetup.com/Ansible-New-Zealand/events/271707416/
 

反馈

有任何想问的问题或希望我们涵盖的议题?请发送电子邮件至 [email protected]

 

 




保护 Tower 安装程序密码

保护 Tower 安装程序密码

Red Hat Ansible Automation Platform 的关键组成部分之一是 Ansible Tower。Ansible Tower 有助于扩展 IT 自动化、管理复杂的部署并提高生产力。Ansible Tower 的优势在于其简单性,这同样体现在安装过程中:当以非容器版本安装时,一个简单的脚本用于读取初始配置中的变量以部署 Ansible Tower。相同的脚本和初始配置甚至可以重复使用以扩展设置,例如添加更多集群节点。

但是,此初始配置的一部分是数据库、Ansible Tower 本身等的密码。在许多在线示例中,这些密码通常以明文形式存储。我作为 Red Hat 顾问经常遇到的一个问题是如何保护这些信息。一个常见的解决方案是在完成 Ansible Tower 的安装后简单地删除该文件。但是,您可能希望保留该文件的原因有很多。在本文中,我将介绍另一种保护安装文件中的密码的方法。

Ansible Tower 的 setup.sh

简要介绍一下背景,setup.sh 是用于安装 Ansible Tower 的脚本,在常规安装程序和捆绑安装程序中均提供。setup.sh 脚本只执行几个任务,例如验证 Ansible 是否已安装在本地系统上以及设置安装程序日志;但最重要的是,它启动 Ansible 来处理 Ansible Tower 的安装。可以使用 -i 参数向安装程序指定清单文件,或者如果未指定,则使用默认提供的清单文件(位于 setup.sh 旁边)。在清单文件的第一个部分,我们有组用于指定将安装 Ansible Tower 和数据库的服务器

[tower]
localhost ansible_connection=local

[database]

并且,在这些组规范之后,有一些变量可用于设置连接和密码,这通常是您输入明文密码的地方,例如

[all:vars]
admin_password='T0w3r123!'

pg_host=''
pg_port=''

pg_database='awx'
pg_username='awx'
pg_password='DB_Pa55w0rd!'

在上面的示例中,这些密码以明文形式显示。我合作过的许多客户出于安全原因,不希望将密码以明文形式保存在清单文件中。安装 Ansible Tower 后,可以安全地删除此文件,但如果您需要修改安装以将节点添加到集群或添加/删除清单组,则需要重新生成此文件。同样,如果您想使用 setup.sh 的备份和还原功能,也需要包含所有密码的清单文件,就像最初安装时一样。

Vault 救援

由于安装程序使用 Ansible 来安装 Ansible Tower,因此我们可以利用一些 Ansible 概念来保护我们的密码。具体来说,我们将使用Ansible vault来使用加密密码而不是明文密码。如果您不熟悉 Ansible vault,它是一个随 Red Hat Ansible Automation Platform 自带的程序,是一种加密和解密数据的机制。它可以用于单个字符串,也可以加密整个文件。在我们的示例中,我们将加密单个字符串作为密码。如果您最终将清单文件提交到源代码管理工具中,这将非常有用。SCM 将能够显示您在提交中更改的单个密码,而不是只能说加密文件已更改(但无法显示加密文件中更改了哪个密码)。

首先,我们将使用以下命令加密管理员密码(<> 中的字段表示 ansible-vault 的输入)

$ ansible-vault encrypt_string --stdin-name admin_password
New Vault password:
Confirm New Vault password:
Reading plaintext input from stdin. (ctrl-d to end input)
<t0w3r123!>admin_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66663534356430343166356461373464336332343439393731363365303063353032373564623537
          3466663861633936366463346135656130306538376637320a303738653264333737343463613366
          31396336633730323639303436653330386536363838646161653562373631323766346431663461
          6536646264633563660a343163303334336164376339363161373662613137633436393263376631
          3539
Encryption successful
</t0w3r123!>

在此示例中,我们正在运行 ansible-vault 并要求它加密一个字符串。我们已告诉 ansible-vault 此变量将称为 admin_password,其值为 T0w3r123!(我们将在清单文件中输入的内容)。在示例中,我们使用了 'password' 作为密码来加密这些值。在生产环境中,应使用更强大的密码来执行您的 vault 加密。在命令的输出中,在两次 ctrl-d 输入之后,加密的变量将显示在屏幕上。我们将获取此输出并将其放入名为 passwords.yml 的文件中,该文件位于清单文件旁边。加密第二个 pg_password 后,我们的 password.yml 文件如下所示

---
admin_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66663534356430343166356461373464336332343439393731363365303063353032373564623537
          3466663861633936366463346135656130306538376637320a303738653264333737343463613366
          31396336633730323639303436653330386536363838646161653562373631323766346431663461
          6536646264633563660a343163303334336164376339363161373662613137633436393263376631
          3539
pg_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          65633239383761336539313437643733323235366337653164383934303563643464626562633865
          3130313231666531613131633736386134343664373039620a336237393631333532373066343135
          65316431626630633965623134623133353635376236306538653230363038333661623236376330
          3664346237396139610a376536373132313237653239353832623433663230393464343331356561
          3435

现在我们已经完成了 passwords.yml 文件,我们必须告诉安装程序从该文件中加载密码,并提示我们输入 vault 密码以解密该值。为此,我们将向 setup.sh 命令添加三个参数。第一个选项是 [email protected],这是一个标准语法,用于告诉 Ansible 从指定的文件名(在本例中为 passwords.yml)加载变量。第二个选项将是 --,它将告诉 setup.sh 脚本任何后续选项都应传递给 Ansible 而不是由 setup.sh 处理。最后一个选项将是 --ask-vault-pass,它告诉 Ansible 提示我们输入密码才能解密 vault 密钥。我们的设置命令将组合为

$ ./setup.sh [email protected] -- --ask-vault-pass

如果您通常向 setup.sh 添加参数,则需要将它们合并到此命令结构中。setup.sh 的参数需要放在 -- 之前,传递给 Ansible 的任何参数都应放在 -- 之后。

使用这些选项运行 setup.sh 时,现在将提示您在 Ansible 安装程序开始之前输入 vault 密码

$ ./setup.sh [email protected] -- --ask-vault-pass
Using /etc/ansible/ansible.cfg as config file
Vault <password>:

PLAY [tower:database:instance_group_*:isolated_group_*] ******************************************************************************************

在这里,我必须输入我弱的 vault 密码 'password' 才能使解密过程正常工作。

即使您在清单文件中保留了空白密码变量,此技术也能正常工作,因为使用了Ansible 的变量优先级。任何变量可以获得的最高优先级来自 extra_vars(即我们添加到安装程序中的 -e 选项),因此 vault 文件中的值将覆盖清单文件中指定的任何值。

使用此方法,您可以将清单文件和密码文件保存在磁盘上或 SCM 中,而无需在其中包含明文密码。

另一种解决方案

如果您只想使用一个清单文件,则可以采取的另一种选择是将现有的 ini 清单文件转换为基于 yaml 的清单。这将允许您将变量直接嵌入为 vault 加密值。虽然执行此操作的范围超出了本文的范围,但示例 inventory.yml 文件可能类似于以下内容

all:
  children:
    database: {}
    tower:
      hosts:
        localhost:
  vars:
    admin_password: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        66663534356430343166356461373464336332343439393731363365303063353032373564623537
        3466663861633936366463346135656130306538376637320a303738653264333737343463613366
        31396336633730323639303436653330386536363838646161653562373631323766346431663461
        6536646264633563660a343163303334336164376339363161373662613137633436393263376631
        3539
    ansible_connection: local
    pg_database: awx
    pg_host: ''
    pg_password: !vault |
        $ANSIBLE_VAULT;1.1;AES256
        65633239383761336539313437643733323235366337653164383934303563643464626562633865
        3130313231666531613131633736386134343664373039620a336237393631333532373066343135
        65316431626630633965623134623133353635376236306538653230363038333661623236376330
        3664346237396139610a376536373132313237653239353832623433663230393464343331356561
        3435
    pg_port: ''
    pg_sslmode: prefer
    pg_username: awx
    rabbitmq_cookie: cookiemonster
    rabbitmq_password: ''
    rabbitmq_username: tower
    tower_package_name: ansible-tower
    tower_package_release: '1'
    tower_package_version: 3.6.3

使用像这样的文件,setup.sh 就可以这样调用了

$ ./setup.sh -i inventory.yml -- --ask-vault-pass

使用这种方法在升级 Ansible Tower 时需要做更多的工作,因为在提供的清单文件中任何字段的更改都需要反映在您的 yaml 清单中,而之前的方法只需要将清单文件中新增的密码字段添加到 password.yml 文件中即可。




牛角号 #6

Ansible Bullhorn banner

号角

Ansible 开发者社区通讯

欢迎阅读号角,这是我们面向 Ansible 开发者社区的通讯。如果您有任何问题或想要分享的内容,请发送电子邮件至 [email protected]
 

ANSIBLE 2.8.13 和 2.9.10 发布

Ansible 核心团队于 6 月 19 日宣布发布 Ansible 2.9.10,以及于 7 月 15 日发布 Ansible 2.8.13,这两个版本都是维护版本。请点击链接查看 Rick Elrod 发送到 ansible-devel 邮件列表中的邮件,获取关于新功能、安装说明以及完整变更日志的链接。
 

虚拟 Ansible 贡献者峰会回顾

第二次完全虚拟的 Ansible 贡献者峰会于 7 月 6 日举行。近 70 位贡献者(新老贡献者)参加了当天的活动,比之前的活动增加了约 20 人。您可以查看峰会 视频,以及 IRC 会议的 摘要完整日志

7 月 7 日至 8 日,我们举办了虚拟 Ansible 黑客马拉松,在此期间,我们对贡献者峰会上讨论的问题进行了跟进。黑客马拉松的 摘要完整日志 也已发布。

活动期间创建了以下新的集合:community.digitaloceancommunity.proxysqlcommunity.mysql。感谢我们社区的贡献者们!

无论您是否能够参加此次活动,我们都希望您能提供反馈,帮助我们改善贡献者体验。这是 贡献者调查;请花几分钟时间填写(如果您还没有填写的话)。

下一次贡献者峰会将于 2020 年 10 月 12 日举行。它将再次成为一次虚拟体验,并在同一周与 AnsibleFest 同时举行。当我们有更多详细信息时,我们将在以后的牛角号中分享!
 

工作组更新


多元化(新增!)
  • Ansible 社区启动了一个新的 工作组,专注于改善项目中的多元化和包容性。希望参与这项工作的社区成员可以加入 Freenode IRC 上的 #ansible-diversity 频道。您还可以查看上周虚拟 Ansible 贡献者峰会上发布的 公告
 

统计数据更新

我们的团队统计人员 Greg 'Gwmngilfen' Sutcliffe 一直在努力处理贡献者峰会上提出的一些建议。其中一个想法,来自 Jeff Geerling,是某种贡献者热力图,以便我们能够看到哪些地方有活动,以及潜在的“巴士因素”。这是该地图的第一个版本。

颜色范围从红色的“1 个贡献者”到池塘中的“许多”,白色则集中在 5 个唯一贡献者。

Community.General 拥有 **如此** 大量的贡献者,以至于掩盖了其他部分 - 但请注意,有多少个集合在任何单个文件中都 <5 个贡献者,但在目录级别总体上都很健康,这很好!如果您想放大查看,可以在 Ansible 统计页面 上看到更大版本的图片。
 

社区内容

每个月我们都会注意到社区发布了很多很棒的内容。虽然并非所有内容都严格针对开发者,但这里可能有一两篇文章引起了您的兴趣?如果您想看到更多这样的内容,请告诉我们。

Evgeni Golov 详细介绍了他们如何为 Foreman 项目 批量迁移 Ansible 集合内的模块,并提供了使用的脚本。

Wu 分享了他如何在 CentOS 8 上 使用 Ansible 管理 Windows 服务器

这是 第一部分第二部分,由 Baptiste Mille-Mathias 编写的关于使用 Ansible 进行 Kubernetes 配置管理的文章,他也参加了我们的虚拟贡献者峰会。

XLAB 蒸汽朋克的 Tadej Borovšak 涵盖了一个重要的主题 - 测试 - 并撰写了 将集成测试添加到 Ansible 内容集合

Nicolas Leiva 描述了如何使您喜欢的 Python 库成为 Ansible 模块以自动执行网络安全工作流程

Carol Chen,Ansible 社区团队成员,谈到了 连接和发展您的社区,并以 Ansible 社区聚会小组为例。
 

ANSIBLE 线上聚会

下个月 Ansible 社区将举办以下线上聚会

DevOps 托伦-比亚韦斯托克的 Ansible:DevOps 世界中的质量保证
7 月 15 日星期三 · 格林威治标准时间下午 5:00
https://www.meetup.com/Ansible-in-DevOps-Torun-Bydgoszcz/events/271620303/ 

明尼阿波利斯的 Ansible:使用 Ansible 创建 AWS AMI 镜像
7 月 16 日星期四 · 格林威治标准时间下午 6:30
https://www.meetup.com/Ansible-Minneapolis/events/sbqkgrybckbvb/

印度 Ansible 聚会:Ansible 网络自动化的入门
7 月 18 日星期六 · 格林威治标准时间上午 9:45
通过您“附近”的其中一个聚会小组 RSVP:奥朗加巴德班加罗尔钦奈德里海得拉巴加尔各答孟买浦那!(它们将链接到同一个虚拟活动。)

沃斯堡/达拉斯的 Ansible:利用 Ansible 和 Pureport 实现多云网络
7 月 28 日星期二 · 格林威治标准时间下午 4:00
https://www.meetup.com/Ansible-Fort-Worth/events/271912439/
https://www.meetup.com/Ansible-Dallas/events/271912537/

Ansible 新西兰:构建无状态自配置 Ansible 集群
8 月 13 日(星期四)中午 12:00 GMT+12
https://www.meetup.com/Ansible-New-Zealand/events/271707416/ 

这是 6 月 27 日举行的上一届印度 Ansible 聚会 播放列表



注意:对于这些虚拟活动,一旦您 RSVP 参加,即可看到参加聚会的链接。如果您对所介绍的主题感兴趣,只要时区和语言适合您,您就可以从世界任何地方加入!
 

反馈

有任何想问的问题或希望我们涵盖的议题?请发送电子邮件至 [email protected]

 

 




使用 Ansible Tower 和 Splunk Enterprise 集中您的自动化日志

使用 Ansible Tower 和 Splunk Enterprise 集中您的自动化日志

对于许多 IT 团队来说,自动化如今已成为核心组成部分。但自动化本身并不是孤立存在的——它是拼图的一部分,需要与周围的 IT 环境交互。因此,衡量自动化的一个方法是它与 IT 生态系统中的其他工具(如中央日志记录基础设施)的集成程度。毕竟,通过中央日志记录,IT 团队可以快速了解正在发生的事情、发生地点以及状态。

Red Hat Ansible Automation Platform 是一个用于构建和运营大规模自动化的解决方案。作为平台的一部分,Ansible Tower 与外部日志记录解决方案(如 Splunk)很好地集成,并且易于设置。在本博文中,我们将演示如何在 Splunk 和 Ansible Tower 中执行必要的配置,以使它们能够协同工作。

Splunk 的设置

第一步是启动并运行 Splunk。您可以在 Splunk 主页 注册后下载 Splunk RPM。

注册后,下载 rpm 并执行安装

$ rpm -ivh splunk-8.0.3-a6754d8441bf-linux-2.6-x86_64.rpm
warning: splunk-8.0.3-a6754d8441bf-linux-2.6-x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID b3cd4420: NOKEY
Verifying...                    ################################# [100%]
Preparing...                    ################################# [100%]
Updating / installing...
   1:splunk-8.0.3-a6754d8441bf  ################################# [100%]
complete

安装完成后,执行以下命令启动服务并进行必要的设置。

$  /opt/splunk/bin/splunk start -accept-license

接受条款,设置用户名和密码,然后等待服务启动。

All preliminary checks passed.

Starting splunk server daemon (splunkd)...
Done
                                                        [  OK  ]

Waiting for web server at http://127.0.0.1:8000 to be available... Done


If you get stuck, we're here to help.
Look for answers here: http://docs.splunk.com

The Splunk web interface is at http://splunk-server:8000

访问 Web 界面并输入用户名和密码。

使用 Red Hat Ansible 内容集合配置数据输入

要在 Splunk 中接收 Ansible Tower 日志,我们需要创建一个数据输入 TCP。为此,我们将使用 Splunk Enterprise Security 内容集合,该集合在 Automation Hub 上作为 Red Hat 托管内容集合版本的一部分提供。

此集合旨在支持 Splunk Enterprise Security(一种作为 Splunk Enterprise 附加应用程序提供的安全产品),并将其扩展以提供安全信息和事件管理 (SIEM) 功能。Splunk Enterprise Security 利用底层平台的许多功能,因此,尽管它是为安全自动化用例而开发的,但此集合中的大多数模块也可用于支持 Day 0 和 Day 1 IT 运营用例。如果您想了解更多关于作为 Ansible 安全自动化计划的一部分而开发的 Ansible 内容集合如何帮助克服安全操作挑战的信息,请查看我们 Roland Wolters 的博文“Ansible 安全自动化入门:调查增强”。

截至今天,Splunk Enterprise Security 内容集合具有以下模块

  • adaptive_response_notable_event - 管理 Splunk Enterprise Security 显着事件自适应响应
  • correlation_search - 管理 Splunk Enterprise Security 关联搜索
  • correlation_search_info - 管理 Splunk Enterprise Security 关联搜索
  • data_input_monitor - 管理类型为 Monitor 的 Splunk 数据输入
  • data_input_network - 管理类型为 TCP 或 UDP 的 Splunk 数据输入

如果您想了解有关集合的更多信息以及如何开始使用它们,请查看 Ajay Chenampara 的博文“Ansible 集合实践”。

回到我们的用例,我们将使用 data_input_network 模块。首先让我们安装集合 splunk.es

$ ansible-galaxy collection install splunk.es
Process install dependency map
Starting collection install process
Installing 'splunk.es:1.0.0' to '/root/.ansible/collections/ansible_collections/splunk/es'

安装集合后,下一步是创建我们的清单

[splunk]
splunk.customer.com

[splunk:vars]
ansible_network_os=splunk.es.splunk
ansible_user=USER
ansible_httpapi_pass=PASS
ansible_httpapi_port=8089
ansible_httpapi_use_ssl=yes
ansible_httpapi_validate_certs=True
ansible_connection=httpapi

请注意,我们将连接类型设置为 httpapi:与 Splunk Enterprise Security 的通信通过 REST API 进行。此外,请记住根据您的环境调整身份验证、端口和证书数据。

接下来让我们创建将设置输入网络的 playbook

---
- name: Splunk Data Input
  hosts: splunk
  gather_facts: False
  collections:
    - splunk.es

  tasks:
    - name: create splunk_data_input_network
      splunk.es.data_input_network:
        name: "9199"
        protocol: "tcp"
        source: "http:tower_logging_collections"
        sourcetype: "httpevent"
        state: "present"

让我们运行 playbook 以创建输入网络

$ ansible-playbook -i inventory.ini splunk_with_collections.yml

验证数据输入

要验证我们的数据输入是否已创建,在 Splunk Web 界面中,单击**设置 -> 数据输入 -> TCP**。验证 TCP 端口是否列为源类型“httpevent”,如下面的屏幕截图所示

Splunk blog one

我们还可以通过检查端口 9199 是否打开并接收连接来验证数据输入。

$  telnet splunk.customer.com 9199
Trying 1.2.3.4...
Connected to splunk.customer.com.
Escape character is '^]'.

配置 Ansible Tower

Ansible Tower 中的活动流日志提供有关创建和删除对象的信息,例如记录 Ansible Tower 内的活动,有关更多信息和详细信息,请查看文档

Splunk 设置完成后,让我们深入了解 Ansible Tower,并将这两个工具相互连接!首先,我们将配置 Ansible Tower 将日志发送到 Splunk 中的数据输入。为此,我们输入 Ansible Tower 设置:在那里,选择“系统”并单击“日志记录”。这将打开 Ansible Tower 日志记录配置的概述,如下所示。在那里,我们指定 Splunk 的 URL 以及 URL 上下文/services/collector/event。此外,我们必须提供端口(此处为 9199),并选择正确的聚合器类型(此处为 Splunk)。现在选择协议 TCP,然后先单击“保存”按钮,然后单击“测试”按钮以验证我们的配置。

Splunk blog two

在 Splunk 中查看日志

现在 Ansible Tower 已全部设置好,让我们回到 Splunk 并检查日志是否正在传输到那里。在 Splunk 主页中,单击“搜索和报告”。在“要搜索的内容”中选择“数据摘要”。将打开一个窗口,您可以在其中单击“来源”列

Splunk blog three

单击源 http:tower_logging_collection,这将带我们到搜索屏幕,在该屏幕上可以查看从 Ansible Tower 收到的记录

splunk blog

如果一切正常,您应该会看到从 Ansible Tower 收到的最后日志事件,表明这两个工具现在已正确连接。恭喜!

但我们不想止步于此:毕竟,日志记录就是分析传入信息并使其有意义。因此,让我们创建一个过滤器:单击您要过滤的字段,然后选择“添加到搜索”。

splunk blog five

之后,搜索字段将填充我们的过滤器。

splunk blog six

创建简单的仪表板

在此示例中,我们将创建 Ansible Tower 生成的事件的简单图表。

我们将使用上一步关于如何创建过滤器的步骤,但这次我们将过滤事件字段,在搜索字段中我们将保持这种方式

source="http:tower_logging_collection"| spath event | search event=*

使用event = *过滤所有事件。之后,单击左侧菜单上的“所有字段”按钮,选择事件字段,然后单击退出。完成后,单击“可视化”,然后选择“透视”选项,在窗口中选择“选定字段 (1)”,然后单击“确定”。

splunk blog seven

在此窗口中,我们将保留过滤器为“所有时间”,在“拆分列”中选择事件,然后“添加到表格”,之后我们已经可以查看按列分隔的信息,列名是事件及其在日志中出现的次数。

splunk blog eight

查看完列中的信息后,单击“另存为”并选择“仪表板面板”。在“仪表板”中选择“新建”,在“仪表板标题”中定义您想要的仪表板名称,此名称将生成仪表板 ID,在“面板标题”和“模型标题”中定义此搜索的名称,例如 all_events,然后单击“保存”,然后单击“查看仪表板”。

splunk blog nine

在以下屏幕中,单击右上角菜单中的“编辑”,然后在 all_events 面板中单击“选择可视化”,选择您想要的可视化,在此示例中我们选择“条形图”,然后单击“保存”。

splunk blog ten

现在我们有了包含列出所有事件的图表的仪表板,重复创建过滤器的过程,并在保存搜索时,选择现有仪表板以将新面板添加到我们创建的仪表板。

创建一些面板并将其添加到现有仪表板后,我们将获得如下可视化效果

splunk blog eleven

要使用将 Ansible Tower 与 Splunk 集成的更多高级功能,请参阅集合Splunk_enterprise_security,它将允许您配置数据输入和搜索关联选项,以及其他功能。

要点和下一步

在这篇文章中,我们演示了如何将 Ansible Tower 使用日志发送到 Splunk,以启用对 Ansible Tower 生成所有事件的集中视图。这样,我们可以从各种信息创建图表,例如失败或成功的 playbook 数量、在执行的 playbook 中使用最多的模块等等。




深入探讨 Cisco ASA 资源模块

深入探讨 Cisco ASA 资源模块

最近,我们发表了对应用于 Ansible 安全自动化计划目标用例的资源模块的想法。该原理在网络自动化领域广为人知,我们遵循既定路径。虽然上一篇博文涵盖了一些基本示例,但我们想展示更详细的用例以及如何使用资源模块解决这些用例。

本博文深入探讨了新的 Cisco ASA 内容集合,该集合已在上一篇文章中介绍过。我们将逐步介绍几个示例,并描述用例以及我们设想在现实世界场景中如何使用该集合。

Cisco ASA 认证内容集合:它是什么?

Cisco ASA 内容集合提供了自动化Cisco 自适应安全设备系列(简称 Cisco ASA)的方法,因此得名。凭借其在防火墙和网络安全方面的优势,它们在市场上广为人知。

该集合的目标是将 Cisco ASA 设备集成到自动化的安全工作流程中。为此,该集合提供了模块来自动化通用命令和与设备的配置交互,以及访问控制列表 (ACL) 和对象组 (OG) 的面向资源的自动化。

如何安装 Cisco ASA 认证 Ansible 内容集合

Cisco ASA 集合可在 Automation Hub(我们提供的软件即服务产品)上供 Red Hat Ansible Automation Platform 客户使用,该产品位于 cloud.redhat.com,是 Red Hat 订阅者快速查找和使用 Red Hat 及其技术合作伙伴支持的内容的地方。

完成此操作后,可以轻松安装集合

ansible-galaxy collection install cisco.asa

或者,您也可以在 Ansible Galaxy 中查找集合,这是我们用于在社区中共享内容的开源中心。

Cisco ASA 内容集合中有什么?

该 Collection 的重点在于提到的模块(以及支持它们的插件):有三个用于基本交互的模块,asa_facts、asa_cli 和 asa_config。如果您熟悉 Ansible 的其他网络和防火墙 Collection 和模块,您会认出这种模式:这三个模块提供了与网络和防火墙解决方案交互的最简单方法。使用它们,可以接收通用数据,发送任意命令和管理配置部分。

虽然这些模块已经为设备完全未自动化的环境提供了巨大的价值,但本文的重点在于 Collection 中的其他模块:资源模块 asa_ogs 和 asa_acls。作为资源模块,它们的范围有限,但使用户能够专注于特定的资源,而不会受到其他内容或配置项的干扰。由于其他 Collection 遵循相同的模式,因此它们还能够实现更简单的跨产品自动化。

如果您仔细查看,您会发现另外两个模块:asa_ogs 和 asa_acls。正如我们在关于安全自动化资源模块的第一篇博文中提到的,这些是已弃用的模块,以前用于配置 ACL 和 OG。它们已被资源模块取代。

以 Collection 的方式连接到 Cisco ASA

该 Collection 支持 network_cli 作为连接类型。结合网络操作系统 cisco.asa.asa、用户名和密码,您就可以开始了。为了快速入门,您可以简单地将这些详细信息作为清单中的变量提供。

[asa01]
host_asa.example.com

[asa01:vars]
ansible_user=admin
ansible_ssh_pass=password
ansible_become=true
ansible_become_method=ansible.netcommon.enable
ansible_become_pass=become_password
ansible_connection=ansible.netcommon.network_cli
ansible_network_os=cisco.asa.asa
ansible_python_interpreter=python

请注意,在生产环境中,应以安全的方式支持这些变量,例如,借助 Ansible Tower 凭据

用例:ACL

在完成所有这些设置后,我们现在准备深入了解实际的 Collection 以及如何使用它们。对于第一个用例,我们希望了解如何在 ASA 中管理 ACL。在深入研究 Ansible Playbook 示例之前,让我们快速讨论一下什么是 ASA ACL 以及自动化实践者应该注意什么。

ASA 访问列表在全局创建,然后使用 access-group “command” 应用。它们可以应用于入站或出站。用户在 Cisco ASA 防火墙上使用访问列表时,需要注意以下几点

  • 当用户为从高安全级别到低安全级别的流量(即出站流量)创建 ACL 时,源 IP 地址是主机或网络的地址(而不是 NAT 转换后的地址)。

  • 当用户为从低安全级别到高安全级别的流量(即入站流量)创建 ACL 时,目标 IP 地址必须是以下两者之一

    • 8.3 之前的任何 ASA 版本的转换后的地址。
    • ASA 8.3 及更高版本的地址。
  • 访问列表始终在 NAT 转换之前进行检查。

此外,更改 ACL 可能会很快变得非常复杂。这不仅与配置本身有关,还与自动化实践者的意图有关:是否应该将新的 ACL 添加到现有配置中?或者应该替换它?合并它们又如何呢?

这些问题的答案通常取决于部署更改的环境和情况。更改 ACL 的不同方法在此处以及 Cisco ASA 内容 Collection 中被记为“状态”:部署对 ACL 的更改的不同方法。

ACLs 模块知道以下状态

  • 已收集 (Gathered)
  • 已合并 (Merged)
  • 已覆盖 (Overridden)
  • 已替换 (Replaced)
  • 已删除 (Deleted)
  • 已呈现 (Rendered)
  • 已解析 (Parsed)

在本用例讨论中,我们将查看所有这些状态,尽管并非总是详细介绍。但是,我们将为感兴趣的读者提供完整代码列表的链接。

请注意,虽然我们通常使用网络地址作为源和目标示例,但其他值(如网络对象组)也是可能的。

状态已收集 (Gathered):使用配置数据填充清单

鉴于资源模块允许读取现有网络配置并将其转换为结构化数据模型,“已收集 (gathered)”状态等同于为此特定资源收集 Ansible 事实。如果以后应将特定的配置片段重复用作变量,这将非常有用。另一个用例是读取现有网络配置并将其存储为平面文件。此平面文件可以定期提交到 git 存储库,有效地跟踪当前配置和安全工具的更改。

为了展示如何将现有配置存储为平面文件,让我们采用以下设备配置

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list test_access; 2 elements; name hash: 0x96b5d78b
access-list test_access line 1 extended deny tcp 192.0.2.0 255.255.255.0 192.0.3.0 255.255.255.0 eq www log default (hitcnt=0) 0xdc46eb6e
access-list test_access line 2 extended deny icmp 198.51.100.0 255.255.255.0 198.51.110.0 255.255.255.0 alternate-address log errors interval 300 (hitcnt=0) 0x68f0b1cd
access-list test_R1_traffic; 1 elements; name hash: 0x2c20a0c
access-list test_R1_traffic line 1 extended deny tcp 2001:db8:0:3::/64 eq www 2001:fc8:0:4::/64 eq telnet (hitcnt=0) 0x11821a52

为了如上所述收集和存储内容,我们需要首先从每个设备收集数据,然后创建映射我们设备的目录结构,然后将配置存储在那里,在本例中为 YAML 文件。以下 playbook 正是这样做的。请注意第一个任务中的参数 state: gathered。

---
- name: convert interface to structured data
  hosts: asa
  gather_facts: false
  tasks:


    - name: Gather facts
       cisco.asa.asa_acls:
         state: gathered
       register: gather

    - name: Create inventory directory
      become: true
      delegate_to: localhost
      file:
       path: "{{ inventory_dir }}/host_vars/{{ inventory_hostname }}"
       state: directory

    - name: Write each resource to a file
      become: true
      delegate_to: localhost
      copy:
        content: "{{ gather[‘gathered’][0] | to_nice_yaml }}"
        dest: "{{ inventory_dir }}/host_vars/{{ inventory_hostname }}/acls.yaml"

“已收集 (gathered)”状态仅收集现有数据。与大多数其他状态相反,它不会更改任何配置。从读取初始配置中获得的结果数据结构如下所示

$ cat lab_inventory/host_vars/ciscoasa/acls.yaml
- acls:
   - aces:
       - destination:
           address: 192.0.3.0
           netmask: 255.255.255.0
           port_protocol:
                 eq: www
         grant: deny
         line: 1
         log: default
         protocol: tcp
         protocol_options:
           tcp: true
         source:
           address: 192.0.2.0
           netmask: 255.255.255.0
...

您可以在 state: gathered 参考 gist 中查看所有命令和示例输出的完整详细列表。

状态已合并 (Merged):添加/更新配置

在第一个非更改状态之后,我们现在来看一个更改目标配置的状态:“已合并 (merged)”。此状态也是任何可用资源模块的默认状态 - 因为它只是添加或更新用户提供的配置。简单明了。

例如,让我们采用以下现有设备配置

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list test_access; 1 elements; name hash: 0x96b5d78b
access-list test_access line 1 extended deny tcp 192.0.2.0 255.255.255.0 192.0.3.0 255.255.255.0 eq www log debugging interval 300 (hitcnt=0) 0xdc46eb6e

假设我们想要部署我们作为平面文件存储在已收集示例中的配置。请注意,平面文件的内容基本上是一个名为“acls”的变量。给定此平面文件和变量名,我们可以使用以下 playbook 将配置部署到设备上

---
- name: Merged state play
  hosts: cisco
  gather_facts: false
  collections:
   - cisco.asa

  tasks:
    - name: Merge ACLs config with device existing ACLs config
      asa_acls:
        state: merged
        config: "{{ acls }}"

一旦我们运行此合并 playbook,所有提供的参数都将被推送到 Cisco ASA 设备并配置。

之后,网络设备配置已更改

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
ccess-list test_access; 2 elements; name hash: 0x96b5d78b
access-list test_access line 1 extended deny tcp 192.0.2.0 255.255.255.0 192.0.3.0 255.255.255.0 eq www log default (hitcnt=0) 0xdc46eb6e
access-list test_access line 2 extended deny icmp 198.51.100.0 255.255.255.0 198.51.110.0 255.255.255.0 alternate-address log errors interval 300 (hitcnt=0) 0x68f0b1cd
access-list test_R1_traffic; 1 elements; name hash: 0x2c20a0c
access-list test_R1_traffic line 1 extended deny tcp 2001:db8:0:3::/64 eq www 2001:fc8:0:4::/64 eq telnet (hitcnt=0) 0x11821a52

我们使用资源模块在 playbook 中描述的所有更改现在都已在设备配置中到位。

如果我们稍微深入研究设备输出,就会有以下观察结果

  • 合并 playbook 配置了 2 个 ACL

    • test_access,配置了 2 个访问控制条目 (ACE)
    • test_R1_traffic 只有一个 ACE
  • test_access 是一个 IPV4 ACL,对于第一个 ACE,我们已将行号指定为 1,而对于第二个 ACE,我们仅指定了名称,这是唯一必需的参数。所有其他参数都是可选的,可以根据特定的 ACE 策略选择。但是请注意,如果我们希望避免 ACE 被配置为 ACL 中的最后一个,则建议配置行号。

  • test_R1_traffic 是一个 IPV6 ACL

  • 由于此设备上没有任何预先存在的 ACL,因此已添加所有 playbook 配置。如果我们有任何预先存在的 ACL,并且 playbook 也具有相同的 ACL(具有不同的 ACE 或相同的 ACE 但配置不同),则合并操作将使用新提供的 ACL 配置更新现有 ACL 配置。

当我们第二次运行相应的合并 playbook 时,自动化带来的另一个好处显现出来:Ansible 的幂等性魅力就出现了!playbook 运行结果为“changed=False”,这向用户确认 playbook 中提供的所有配置已在 Cisco ASA 设备上配置。

您可以在 state: merged 参考 gist 中查看所有命令和示例输出的完整详细列表。

状态已替换 (Replaced):旧的移除,新的加入

另一种典型的情况是,当设备已使用具有现有 ACE 的 ACL 配置,并且自动化实践者想要使用一组新的 ACE 更新 ACL,同时完全丢弃所有已配置的 ACE。

在这种情况下,“已替换 (replaced)”状态是理想的选择:顾名思义,“已替换 (replaced)”状态将使用用户提供的新的 ACE 集替换 ACL 现有的 ACE。如果用户尝试配置任何尚未在设备上预先配置的新 ACL,它将充当合并状态,并且 asa_acls 模块将尝试在替换 playbook 中将用户提供的 ACL ACE 配置。

让我们采用以下初始配置

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list test_access; 2 elements; name hash: 0x96b5d78b
access-list test_access line 1 extended deny tcp 192.0.2.0 255.255.255.0 192.0.3.0 255.255.255.0 eq www log default (hitcnt=0) 0xdc46eb6e
access-list test_access line 2 extended deny icmp 198.51.100.0 255.255.255.0 198.51.110.0 255.255.255.0 alternate-address log errors interval 300 (hitcnt=0) 0x68f0b1cd
access-list test_R1_traffic; 1 elements; name hash: 0x2c20a0c
access-list test_R1_traffic line 1 extended deny tcp 2001:db8:0:3::/64 eq www 2001:fc8:0:4::/64 eq telnet (hitcnt=0) 0x11821a52

现在我们假设我们想要配置一个名为“test_global_access”的新 ACL,并且我们想要用新的源和目标 IP 替换已经存在的“test_access”ACL 配置。我们新期望状态的相应 ACL 配置为

- acls:
   - name: test_access
     acl_type: extended
     aces:
       - grant: deny
         line: 1
         protocol: tcp
         protocol_options:
           tcp: true
         source:
           address: 192.0.3.0
           netmask: 255.255.255.0
         destination:
           address: 192.0.4.0
           netmask: 255.255.255.0
           port_protocol:
             eq: www
         log: default
   - name: test_global_access
     acl_type: extended
     aces:
       - grant: deny
         line: 1
         protocol_options:
           tcp: true
         source:
           address: 192.0.4.0
           netmask: 255.255.255.0
           port_protocol:
             eq: telnet
         destination:
           address: 192.0.5.0
           netmask: 255.255.255.0
           port_protocol:
             eq: www

请注意,定义再次有效地包含在变量“acls”中 - 我们可以将其作为 asa_acls 模块的“config”参数的值进行引用,就像我们在上一个示例中所做的那样。只有 state 参数的值这次不同

---
- name: Replaced state play
  hosts: cisco
  gather_facts: false
  collections:
   - cisco.asa

  tasks:
    - name: Replace ACLs config with device existing ACLs config
      asa_acls:
        state: replaced
        config: "{{ acls }}"

运行 playbook 后,网络设备配置已按预期更改:旧配置已替换为新配置。在没有相应配置需要替换的情况下,添加了新的配置

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list test_access; 1 elements; name hash: 0x96b5d78b
access-list test_access line 1 extended deny tcp 192.0.3.0 255.255.255.0 192.0.4.0 255.255.255.0 eq www log default (hitcnt=0) 0x7ab83be2
access-list test_R1_traffic; 1 elements; name hash: 0x2c20a0c
access-list test_R1_traffic line 1 extended deny tcp 2001:db8:0:3::/64 eq www 2001:fc8:0:4::/64 eq telnet (hitcnt=0) 0x11821a52
access-list test_global_access; 1 elements; name hash: 0xaa83124c
access-list test_global_access line 1 extended deny tcp 192.0.4.0 255.255.255.0 eq telnet 192.0.5.0 255.255.255.0 eq www (hitcnt=0) 0x243cead5

请注意,在本例中 ACL test_R1_traffic 未被修改或删除!

您可以在 state: replaced 参考 gist 中查看所有命令和示例输出的完整详细列表。

状态已覆盖 (Overridden):丢弃不需要的

如上一个示例中所述,定义中未明确提及的 ACL 保持不变。但是,如果需要使用输入 ACL ACE 配置重新配置所有现有和预配置的 ACL,以及影响那些未提及的 ACL 呢?这就是“已覆盖 (overridden)”状态发挥作用的地方。

如果您采用上一个示例中的相同初始环境并对它部署相同的 ACL 定义,但这次将状态切换为“已覆盖 (overridden)”,则设备的结果配置看起来大不相同

部署 ACL 之前,初始设备配置

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list test_access; 2 elements; name hash: 0x96b5d78b
access-list test_access line 1 extended deny tcp 192.0.2.0 255.255.255.0 192.0.3.0 255.255.255.0 eq www log default (hitcnt=0) 0xdc46eb6e
access-list test_access line 2 extended deny icmp 198.51.100.0 255.255.255.0 198.51.110.0 255.255.255.0 alternate-address log errors interval 300 (hitcnt=0) 0x68f0b1cd
access-list test_R1_traffic; 1 elements; name hash: 0x2c20a0c
access-list test_R1_traffic line 1 extended deny tcp 2001:db8:0:3::/64 eq www 2001:fc8:0:4::/64 eq telnet (hitcnt=0) 0x11821a52

部署 ACL 后,设备配置通过资源模块列出上次的列表,但这次使用“已覆盖 (overridden)”状态

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list test_access; 1 elements; name hash: 0x96b5d78b
access-list test_access line 1 extended deny tcp 192.0.3.0 255.255.255.0 192.0.4.0 255.255.255.0 eq www log default (hitcnt=0) 0x7ab83be2
access-list test_global_access; 1 elements; name hash: 0xaa83124c
access-list test_global_access line 1 extended deny tcp 192.0.4.0 255.255.255.0 eq telnet 192.0.5.0 255.255.255.0 eq www (hitcnt=0) 0x243cead5

请注意,这次列表短得多 - ACL test_R1_traffic 已被删除,因为它未在部署的 ACL 定义中明确提及。这展示了“已替换 (replaced)”和“已覆盖 (overridden)”状态之间的区别。

您可以在 state: overridden 参考 gist 中查看所有命令和示例输出的完整详细列表。

状态已删除 (Deleted):删除不需要的

另一个更明显的用例是在设备上删除现有的 ACL,这在“已删除 (deleted)”状态中实现。在这种情况下,输入是要删除的 ACL 名称,相应的删除操作将通过删除在相应 ACL 下配置的所有 ACE 来删除特定 ACL 的条目。

例如,让我们使用在其他示例中已使用的棕色字段配置。要删除 ACL test_access,我们在输入变量中命名它。

- acls:
   - name: test_access

剧本看起来与其他示例中的剧本完全一样,只是参数和值状态为:已删除。执行后,设备的配置为

ciscoasa# sh access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list test_R1_traffic; 1 elements; name hash: 0x2c20a0c
access-list test_R1_traffic line 1 extended deny tcp 2001:db8:0:3::/64 eq www 2001:fc8:0:4::/64 eq telnet (hitcnt=0) 0x11821a52

输出明显比之前的配置短,因为缺少整个 ACL。

您可以在state: deleted 参考 gist中查看此示例的所有命令和输出的完整详细列表。

状态渲染和状态解析:用于开发和离线工作

目前还有另外两种状态可用:“rendered” 和“parsed”。两者都比较特殊,因为它们不适用于生产环境,而是在开发您的剧本和设备配置期间使用。它们不会更改设备配置 - 而是以不同的格式输出将要更改的内容。

状态“rendered” 返回将执行以应用提供的配置的命令列表。根据上面使用的配置与我们的棕色字段设备配置给出的返回值内容

"rendered": [
   "access-list test_access line 1 extended deny tcp 192.0.2.0 255.255.255.0 192.0.3.0 255.255.255.0 eq www log default",
   "access-list test_access line 2 extended deny icmp 198.51.100.0 255.255.255.0 198.51.110.0 255.255.255.0 alternate-address log errors",
   "access-list test_R1_traffic line 1 extended deny tcp 2001:db8:0:3::/64 eq www 2001:fc8:0:4::/64 eq telnet"
]

您可以在state: rendered 参考 gist中查看此示例的所有命令和输出的完整详细列表。

状态“parsed” 的作用类似,但它不返回将执行的命令,而是将配置作为 JSON 结构返回,该结构可以在后续的自动化任务或其他程序中重复使用。请参阅我们在state: parsed 参考 gist中解析示例的所有命令和输出的完整详细列表。

用例:对象组

如前所述,Ansible 内容集合支持第二个资源:对象组。可以将其视为网络、用户、安全组、协议、服务等。资源模块可用于定义它们或更改其定义。与 ACL 资源模块非常相似,基本工作流程通过变量结构定义它们,然后以状态参数标识的方式部署它们。状态基本上与 ACL 资源模块理解的状态相同。

由于这种相似性,我们这里将不再详细介绍,而是参考上面提到的不同状态示例。

但是,从安全角度来看,对象组资源模块至关重要:在现代 IT 环境中,通信关系不仅由 IP 地址定义,还可以由关注的对象类型定义:对于安全从业人员来说,能够在对象组中抽象这些类型并在以后的 ACL 中解决它们的通信关系至关重要。

这也解释了为什么我们选择这两个资源模块作为起点:它们紧密配合,共同为使用 Cisco ASA 设备系列实现自动化的安全方法铺平了道路。