xiaohui 安全工具 2019年8月23日发布
收藏
关于Jira的背景知识
JIRA是目前比较流行的基于Java架构的管理系统,由于Atlassian公司对很多开源项目实行免费提供漏洞跟踪服务,因此在开源领域,其认知度比其他的产品要高得多,而且易用性也好一些。同时,开源则是其另一特色,在用户购买其软件的同时,也就将源代码也购置进来,方便做二次开发。JIRA功能全面,界面友好,安装简单,配置灵活,权限管理以及可扩展性方面都十分出色。
JIRA不仅仅是一个漏洞跟踪系统,通过Jira,可以整合客户、开发人员、测试人员,各人各司其职,信息很快得到交流和反馈。
JIRA可以被企业管理人员,项目管理人员,开发人员,分析人员,测试人员和其他人员所广泛使用。对于企业的管理人员来说,根据JIRA系统提供的数据,更加准确地了解项目的开发质量和状态,以及整个团队的工作效率。而对企业的项目管理者来说,可以在 JIRA系统中对问题进行评估、分配任务。还可以通过 JIRA系统的统计报告了解项目进展情况以及团队的工作量、工作效率等信息。
以Yelp为例,介绍一下如何扩展企业的Jira服务器管理
2017年,Yelp已经拥有40多名管理人员,允许整个组织的不同团队协调执行管理任务。但在实践工作中,由于许多管理人员的岗位变动和整个管理团队的人数增加,导致公司的Jira环境累积了数百个孤立的工作流和问题状态。为了解决这个问题,公司构建了一个可扩展的解决方案,使公司的工程师能够使用代码和源代码控制自行创建的Jira项目,以确保所有工程项目的100%标准化,并使Jira更易于管理,更易于使用和更好的性能。本文将介绍Yelp使用Ansible来管理Jira服务器的项目创建、更新和存档过程。
工具选择
首先需要决定使用哪种技术来解决这个问题,公司选择了一个名为Ansible的开源工具作为主要框架,ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
1.连接插件connection plugins:负责和被监控端实现通信;
2.host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
3.各种模块核心模块、command模块、自定义模块;
4.借助于插件完成记录日志邮件等功能;
5.playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
虽然Puppet可以在Yelp上使用,但是不必处理复杂的基础设施来运行Ansible对公司来说至关重要。在实践中,Ansible负责与Jira的REST API交互,以执行项目生命周期的每一步。为此,公司确定了三个关键的项目生命周期要素(项目创建、项目档案、项目更新),每个要素都有自己的playbook。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。
Yelp使用Git来托管公司的配置,这样就可以保持完整的修订历史记录。这些配置在三个不同的存储库中进行维护:
1.Ansible_configs:托管Ansible配置,playbook中的角色元素。
编者住:
· playbook包含以下核心元素:
· Tasks:任务,由模板定义的操作列表
· Variables:变量
· Templates:模板,即使用模板语法的文件
· Handlers:处理器 ,当某条件满足时,触发执行的操作
· Roles:角色
2.Ansible_precommithooks:主机配置Ansible_configs存储库中使用的预提交钩子;
3.Ansible_jira_projects:托管定义每个Jira项目及其配置的YAML文件;
每个项目都由一个YAML文件表示,该文件以易于阅读的方式描述配置:
PROJECTBETA: - key: beta - leader: darwin - board_type: agile - description: the new revolutionary project - security_schema: engineering
然后,公司使用Ansible的强大模板功能将YAML配置文件转换为可由Jira的REST API解释的JSON对象。使用Jinja2,公司创建了自定义模板,将YAML文件转换为不同Jira Server API请求的JSON有效载荷。以下是公司用来创建项目的Jinja2模板的一个示例:
{ "key": "", "name": "", "lead": "", "projectTemplateKey": "", "issueSecurityScheme": "", "permissionScheme": "", "notificationScheme": "" }
为了验证公司的工程师只会推送有效的项目列表,公司使用一个名为“pre-commit”的框架来管理和维护多语言预提交钩子。每次工程师进行提交时,公司定义的预提交钩子都会自动运行以验证列表并识别任何潜在的问题,例如无效的Jira项目密钥,名称或非法字符。
Pre-commit(客户端钩子)有很多预先构建的钩子可以开箱即用,对于这个解决方案,公司使用了check-yaml和sort-simple-yaml之类的解决方案,还编写了公司自己的自定义钩子,以确保所有机密都用Ansible Vault正确加密,并且所有现有和新的YAML文件仅包含允许的密钥或值,以遵循Yelp的Jira项目标准。
下面是公司创建的一个自定义钩子的示例,它用于验证公司的YAML语法。
#!/usr/bin/python import sys import argparse import yaml import re VALID_BOARD_CONFIGS = ['kanban', 'agile'] def main(argv=None): retval = 0 parser = argparse.ArgumentParser() parser.add_argument('filenames', nargs='*', help='Jira project files to check.') args = parser.parse_args(argv) argv = argv if argv is not None else sys.argv[1:] for filename in args.filenames: try: YAML_PROJ_CONF = yaml.safe_load(open(filename)) PROJECT_KEY = YAML_PROJ_CONF.keys()[0] except yaml.YAMLError: print('Error parsing: {}'.format(filename)) retval = 1 continue if 'key' in YAML_PROJ_CONF[PROJECT_KEY]: if not re.match(r"^[A-Z]{2,10}$", YAML_PROJ_CONF[PROJECT_KEY]['key']): print("{} isn't a valid key. The project key MUST be 2-10 characters, only A-Z".format(YAML_PROJ_CONF[PROJECT_KEY]['key'])) retval = 1 else: print('{}: is missing project key'.format(filename)) retval = 1 if not re.match(r"^[a-z]{2,10}$", YAML_PROJ_CONF[PROJECT_KEY]['lead']) and 'svc-' not in YAML_PROJ_CONF[PROJECT_KEY]['lead']: print("{} isn't a valid lead. The lead MUST be 2-10 characters, only a-z".format(YAML_PROJ_CONF[PROJECT_KEY]['lead'])) retval = 1 if YAML_PROJ_CONF[PROJECT_KEY]['board_config'] not in VALID_BOARD_CONFIGS: print("{} isn't a valid board config. You can choose between the following options {}".format(YAML_PROJ_CONF[PROJECT_KEY]['board_config'], VALID_BOARD_CONFIGS)) retval = 1 return retval if __name__ == '__main__': sys.exit(main())
Jenkins(公司的持续集成工具)通过合并三个Git存储库,将所有部分组合在一起,从而验证所有新的和现有的YAML文件是否通过预提交钩子传递验证,然后在Ansible中执行。构建的有效载荷基于新列表文件中包含的信息,并针对Jira的API执行状况进行更改。
公司的Jenkins过程包含四个不同的阶段:
1.审核验证:为了避免工程师在没有代码审核的情况下推送代码,公司已经定制了Gitolite权限,以确保工程师只推送合规的集成。通过这样做,就可以避免公司的存储库中的恶意更改。
2.列表验证:对所有YAML和配置文件运行预提交钩子并验证它们是否通过;
3.Playbook执行:如果前两个阶段通过,Jenkins将根据对存储库所做的更改执行正确的playbook。
4.通知:如果Ansible项目创建或更新或删除成功,它会通知请求者。
实施过程
既然你已经熟悉所有的技术,那么来谈谈具体的实施过程。下图说明了每个组件是如何协同工作以自动部署更改的。
当工程师想要在公司的主要生产实例中创建、更新或删除Jira项目时,他们只需复制“ansible_jira_projects”存储库,其中包含所有现有项目YAML文件。此时,工程师可以选择手动更新现有项目YAML文件,或者使用公司的自助服务脚本之一,根据提示的详细信息自动生成新的项目列表。
当工程师使用Git权限提交更改时,审核过程就开始运行,此时预提交钩子也会同时开始运行。
此时,工程师提交代码审核。审核中包括在预提交钩子中运行的所有测试的结果。
代码审核通过后,工程师就可以使用简单的脚本将更改合并到部署的项目中。
此时,Jenkins将收到公司的Git存储库中的更改成功的通知。
总结
通过使用Ansible,Jenkins,预提交钩子,自定义编写的Python脚本以及易于理解的YAML,公司的管理能够得到如下改进:
1.确保所有工程项目的100%标准化,使Jira更易于管理,更易于使用,性能更佳。
2.通过确保捕获、审核和记录Jira项目生命周期中采取的每个操作,建立严格的审核跟踪流程。
3.消除Jira管理人员的重复性任务;
4.减少Jira项目创建或更新或删除的周转时间,同时还释放公司的Jira管理人员,以他们专注于其他重要任务。
5.减少Jira管理人员的数量;
本文翻译自:https://engineeringblog.yelp.com/2019/04/Scaling-Jira-Server-Administration-For-The-Enterprise.html如若转载,请注明原文地址: https://www.4hou.com/tools/17379.html