使用ansible创建amis的工具

bossimage的Python项目详细描述


bossimage是一个命令行实用程序,用于将"ansible"角色lt;http://docs.ansible.com/ansible/playbooks\roles.html>;``转换为
`amazon ec2
ami<;http://docs.aws.amazon.com/awsec2/latest/userguide/amis.html>;``转换为

bossimage只需要将一个配置文件添加到ansible角色的base
目录中。完成后,可以使用bossimage构建ec2实例,在其上运行ansible角色,然后将其"烘焙"到ami中。在创建ami之后,bossimage还可以从中构建一个test
实例,并在该实例上运行一个test playbook。

bossimage的灵感来自于` packer<;https://www.packer.io/>;``和
` test kitchen<;http://kitchen.ci/>;``这两者,但都要简单得多。如果
同时使用ansibe和aws,您可能会发现它很有用。



installation
===


installation from`pypi<;https://pypi.python.org/pypi>;``uuuu
----




pip install bossimage


install from source
----




cd bossimage
pip install-r requirements.txt
pip install.

quick start
===========

与bossimage的所有交互都是通过名为"bi"的可执行命令完成的,该命令必须始终从
ansible角色的基本目录运行。

创建一个ec2实例并在其上运行ansible(``bi make build``)。
2。从ec2实例(``bi make image``)生成ami。
3。从ami生成一个测试实例,并在其上运行一个test ansible playbook(``bi make test```)。

e shell显示在
前面的"`>;`"表示shell提示。

bossimage要求将名为"`.boss.yml`"的配置文件置于ansible角色的根目录中。
这样一个文件的最小示例如下:

::


平台:
-名称:amz-2015092
实例类型:t2.micro
生成:
源ami:amzn-ami-hvm-2015.09.2.x86-u64-gp2

该示例包含最最小配置possible,除了必需的设置之外,所有设置都使用
默认值:平台
名称、"实例类型"https://aws.amazon.com/ec2/instance types/>;`\uuxbr/>和用于"构建"阶段的源AMI。

y aws
身份验证代码,而不是倾向于通过所有身份验证
传递到底层的
`sdk<;http://boto3.readthedocs.io/en/latest/guide/configuration.html guide configuration>;`
使用"标准环境
变量<;https://blogs.aws.amazon.com/security/post/tx3d6u6wsfgok2h/a-new-and-standardized-way-to-manage-credentials-in-the-aws-sdks>;` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` aws ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` aws ` ` ` ` ` ` ` `>;export aws_profile=uhuru
>;export aws_default_region=us-west-1

环境变量的tead,如下所述。


运行
~~~~~~



大多数"bi"子命令需要一个*insta要传递给
它们的nce*参数。*实例*来自一个*平台*和一个
*配置文件*,即"`<;platform>;-<;profile>;`"。在上面显示的`.boss.yml`
配置中,定义了一个名为
``amz-2015092``的平台。配置文件没有显式定义,因此是
`` default``。因此实例是``amz-2015092-default``,这将是本简介中传递给命令的参数。


稍后将更详细地描述平台和配置文件。

bi make build
^^^^^^^^^^^^^^

关于它。还将创建一个唯一的ssh密钥对并将其分配给该实例。与其他"bi"命令一样,此命令是等幂的,可以多次运行,而不必每次创建新实例。后续运行将
只需在现有实例上再次运行ansible角色。

air bossimage-ozl4nxubam
创建了实例i-00000001
等待实例运行…好的
等待连接到54.xxx.xxx.xxx:22可用…ok

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [54.xxx.xxx.xxx]

TASK [test-role : add package httpd] *******************************************
变更:[54.xxx.xxx.xxx.xxx]


重播***********************************************************************************************************************************************************************
54.xxx.xxx:ok=1变更=1不可访问=0失败=0



双工形象制作
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^br/>
bo的主要目标ssimage是从ansible角色
创建ami,这就是该命令的作用。它可以在"bi make build"完成后运行。

::


>;bi make image amz-2015092-default
创建了名为test role.default.amz-2015092.hvm.x86_64.v2
正在等待映像可用…好的
映像可用

^^^^^^^^^^^^^^^

负责这件事。但是,它取决于"bi make image"命令的成功结果,因为它使用由
该命令创建的ami作为ec2测试实例的源ami。

它也不在实例上运行ansible角色,而是运行
测试剧本,默认情况下它是"test"s/test.yml``,相对于ansible role目录的
根。使用
ansible galaxy`命令创建ansible角色时,默认情况下会添加此测试剧本。
若要使此默认测试剧本与bossimage协同工作,只需进行一个小的
更改:将剧本中的"hosts"从
"localhost"更改为"test"。

:/>
>;bi make test amz-2015092-default
已创建实例i-00000002
正在等待实例运行…确定
等待连接到52.xxx.xxx.xxx:22可用…ok

PLAY [test] ********************************************************************

TASK [setup] *******************************************************************
ok: [52.xxx.xxx.xxx]

TASK [check that httpd is installed] *******************************************
确定:[52.xxx.xxx.xxx]

任务[检查端口80是否正在侦听]*****************************
确定:[52.xxx.xxx.xxx]

*********************************************************************
52.xxx.xxx.xxx:ok=2 changed=0 unreachable=0 failed=0

您将创建一个ami,然后对其进行测试。


继续阅读以了解:

-如何为给定平台构建多个"风格"的ami
-登录生成和测试实例的快捷方式
-清理生成和测试阶段使用的实例和密钥对
-清除未通过测试的ami

==


instances、platforms和profile
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
大多数"bi"子命令,例如"make build"或"make test"`,
使用名为*instance*的参数。实例由
*平台*和*配置文件*定义,例如``rhel6 default``,其中``rhel6``
是平台,``default``是配置文件。

平台
^^^^^^^^^^

平台定义源AMI和与创建EC2实例相关的其他设置,例如安全组和块设备映射。它还定义了ansible访问
实例的连接设置,例如ssh或winrm端口和默认用户名。

profile
^^^^^^

profile定义了将通过其
``--extra vars``参数传递给ansible的变量。通过定义多个配置文件,您可以为一个给定的平台构建多种风格的amis。例如,这里有一个`.boss.yml``有一个平台和两个配置文件。






platforms:
-name:ubuntu-16.04
build:
source-ami:ami-301F6f50
实例类型:t2.micro
清单参数:
ansible_用户:ubuntu
ansible_python_解释器/usr/bin/python3
安全组:[bossimage]

profiles:
-名称:apache
额外变量:
包:

-apache2
-name:nginx
extra-vars:
packages:
-nginx

这些平台和配置文件组合或实例可以
生成自己的ami。

如果未定义"profiles",则每个平台都有一个隐式配置文件,
称为"default"。"default"配置文件不定义任何
变量。注意,如果定义了"profiles",则不再有任何
隐式"default"配置文件。在这种情况下,如果需要,您可以定义一个具有
no``extra_vars``属性的文件。

.boss.yml
——


the``.boss.yml``文件被放在ansible
角色的根目录中。这是使用bossimage所必需的唯一配置。


首先,这里有一个完整的示例供参考。




默认值:
实例类型:m3。大型平台:

-名称:centos-6
实例类型:t2。微型连接出口:600
库存参数:
用户:centos
构建:
源代码:centos linux 6 x86\u 64 hvm ebs 1602-74e73035-3435-48d6-88e0-89cc02ad83ee-ami-21e6d54b.3'
测试:
实例类型:m3.medium
标记:
billing:xyz
描述:centos 6构建实例

-名称:amz-2015092
构建:
源代码:amzn-ami-hvm-2015.09.2.x86-u64-gp2
图像:
ami名称:%(角色)s-%(配置文件)s-%(版本)s-%(平台)s'
块设备映射用法:
-设备名称:dev/sdf
ebs:
卷大小:100
卷类型:gp2
在终端上删除:true
标记:
计费:xyz
描述:amazon linux 201509构建实例

-名称:win-2016
构建:
源代码:ami-2d360152
变为:false
库存参数:
ansible连接:winrm
ansible_port:5985
ansible_user:administrator
映像:
ami_name:"(role)s-%(profile)s-%(version)s-%(platform)s'
标记:
帐单:xyz
描述:Windows Server 2016生成实例

配置文件:
-name:default
-name:nginx
额外变量:
包:
-nginx
-tcpdump

a``.boss.yml``文件有三个可能的部分:

-``默认值`:此部分是可选的,包含要与之一起使用的默认值
在``platforms``中,如果没有提供的话。
-``platforms`:这一部分是必需的,它定义了要从中生成实例的
平台的列表。必须在`.boss.yml``配置中定义至少一个
平台。在"platforms"部分中定义的每个平台都包含自己的子部分,用于"build"、"image"和"test"三个阶段中的每个阶段。
-"profiles":此部分是可选的。在这里,可以定义变量集
,以修改在``platforms`
部分中定义的每个平台。如果未指定此部分,则每个平台都将具有名为"default"的
配置文件,且不设置其他变量。

~~~~~~


"defaults"部分可能包含以下变量。

-``实例类型`-类型:*字符串*,默认值:``t2.micro`

EC2实例类型。

-``username`-类型:*字符串*,默认值:``ec2 user`

ansible将用来连接实例的用户。如果定义了
``inventory_args`,则将忽略此值,而应将
``ansible_user``放入``inventory_args``中。

-``connection`-类型:*字符串*,默认值:``ssh`

ansible将使用的连接类型<;https://docs.ansible.com/ansible/2.6/plugins/connection.html>;``如果定义了`` inventory`参数',则忽略此值,而应将`` ansible`连接``放入`` inventory`参数'。
注意:已知bossimage可用于``ssh`和``winrm`连接,
但其他类型可能需要额外的测试。g和开发。

-``连接超时`-类型:*整数*,默认值:``300`

bossimage放弃尝试建立ansible连接之前的秒数。

-``端口`-类型:*整数*,默认值:22

。如果定义了"inventory_args",则将忽略此值,而应将"ansible_port"放入
"inventory_args"中。

-`"associate_public_ip_address``-类型:*bool*,默认值:`"true`

/>-``子网`-type*string*

要分配给实例的IAM实例配置文件的名称。

-`` inventory_args`` type*map*of*string*to*string*

将用于生成ansible
inventory的键/值对映射。有关可用选项的更多详细信息,请参见"官方ansibe
文档<;https://docs.ansibe.com/ansibe/2.3/intro戋u inventory.html戋行为清单参数列表>;`戋
。如果定义了此变量,则如果使用
,则将忽略
``connection``、``username`和``port``变量,并应替换为inventory参数
``ansible`u connection`,``ansible`u user`,and``ansible`u port`,
注意:bossimage通常根据运行时生成的值在清单中设置``ansible`u password``和
``ansible`u ssh`u private`key`file`,因此除非有充分的理由,否则不建议在
`inventory`u args`中定义它们。


-``标记``-type*map*of*string*to*string*,默认的`{}``

实例。如果它是以映射的形式给出的,则
它必须具有键"file`",这是包含
用户数据的文件的路径。


如果类型是字符串,则它将作为
实例的用户数据逐字传递。


示例:





默认值:
用户数据:
文件:./user data.txt



默认值:
用户数据:
!!/bin/sh
yum update-y

-``block-device-mappings``-type:*list*of*map*,默认值:``[]`


s/ec2.html ec2.serviceresource.create_instances>;`
属性传递给boto3 create_u instances操作。唯一的区别是。boss.yml,"camelcase"属性应
转换为"snake"属性。


platforms
~~~~~~~~~

"platforms"部分包含一个配置列表,每个定义的平台都有一个配置列表。每个平台配置都必须有以下密钥:


-``名称````类型*字符串*,必需



-``构建````类型*映射*,必需



/>请参见下面的"构建<;构建>;`````` ` ` ` `














-``测试````` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `键入*map*,可选

请参见"测试<;测试&g"t;``下面的`.

它们将重写在那里或父平台中给定的任何
定义。

`build``部分还具有以下键:

-``source\u ami``-type:*string*,required


这是要从中生成实例的源ami。它可以是一个
ami id或名称,从中可以找到id。

-``成为`-类型:*布尔型*,默认值:``true`


这告诉ansible是否"成为"超级用户。

image
^^^^

ault:
```%(role)s.%(profile)s.%(platform)s.%(vtype)s.%(arch)s.%(version)s'``

字符串可以包含任何
变量:

-``role`:可承载角色的名称
-``profile`:可承载角色的名称请参阅"role
versions<;role versions>;` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `当然,` ` ` ` ami name` ` ` `也可以是一字不带任何` ` ` ` ` ` ` ` ` `s来自
``默认值'。它们将覆盖其中给出的任何定义或父平台中的任何定义。

此外,``test``部分可能有以下键:

-``playbook``-type:*string*,默认值:``tests/test.yml``

这是要在测试阶段运行的playbook。默认值为
与通过运行
``ansible galaxy init``创建新的ansible角色而创建的测试剧本相同。

已定位。

bi list
^^^^^^


list列出在.boss.yml中配置的可生成实例。
显示实例的状态,可以是"已创建"或"未创建"。



>;bi list
amz-2015092-default created
ubuntu-16.10-default未创建

bi make build
^^^^^^^^^^^^^^^^

::


>;bi make build<;instance>;[-v--verbosity]

还将创建一个唯一的ssh密钥对并将其分配给该实例。此命令
是等幂的,可以多次运行,而不必每次创建新的
实例。随后的运行只需在现有实例上再次运行ansible role


如果ansible role有一个``requirements.yml``文件,则将使用
``ansible galaxy``命令安装该文件中列出的依赖项


传递给ansible。
可以重复四次以增加ansible的详细程度。


bi make image
^^^^^^^^^^^^^^^^^^



>;bi make image<;instance>;[--no wait]

''.除非"bi make build"已运行并将其状态写入"`.boss/<;instance>;-state.yml`"。

默认情况下,当映像可用时,此命令将完成。您可以将选项`--no wait``传递给该命令,这样它就不会
等待映像可用。


bi make test
^^^^^^^^^^^^



>;bi make test<;instance>;[-v--verbosity]

ing
``bi make image``,然后在其上运行测试剧本。除非"bi make image"已运行并将其状态写入
`.boss/<;instance>;-state.yml`.

对于"tests/requirements.yml`.

the`-v``,or`--verbosity``选项,传递给ansible。
它可以重复四次以增加ansible的详细信息。


bi clean build
^^^^^^^^^^^^^^^^^^^^^^^


>;bi clean build<;instance>;



^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^













;bi-clea^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^gt;bi clean test<;instance>;

这将删除由"bi make build"创建的实例。


bi login
^^^^^^^^^^



>;bi login<;instance>;

此命令仅适用于为ssh连接配置了平台的实例,即默认值。默认情况下,此命令将
记录到"build"阶段实例中,但可以通过传递
参数"-p--phase"来更改此参数,该参数可以是"build"或"test"。

::


>;bi login-p test<;instance>;

bi version
^^^^^^^

输出Vbossimage版本。

因此bossimage没有任何可以解析的内容来发现角色的版本。

bossimage还支持在环境变量中定义版本
``bi-role```.


用于
身份验证的标准aws sdk环境变量在"boto3
文档<;http://boto3.readthedocs.org/en/latest/guide/configuration.html configuration>;` uuuu.

如果不在
上运行"bossimage",则最简单的身份验证方法是配置"aws/credentials"。h a
"profile"<;http://docs.aws.amazon.com/cli/latest/userguide/cli chap getting started.html cli multiple profiles>;`serguide/id_roles_在创建时使用_switch-role-ec2_instance-profiles.html>;` uuu
,然后不需要传递任何凭据。IAM
角色应具有以下策略。

::

{
"版本":"2012-10-17",
"声明":[
{
"效果":"允许",
"操作":[
"EC2:createImage",
"EC2:createKeyPair",
"EC2:createTags",
"ec2:deleteKeyPair",
"ec2:deregisterimage",
"ec2:describeimages",
"ec2:describeInstances",
"ec2:runInstances",
"ec2:terminateInstances"
],
"resource":"*"
}
]
}


region
----


必须设置正在运行的AWS区域。为此,请设置
``aws_default_region``环境变量。


基本原理
=


arison with packer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


packer是一个为大量云提供商和本地用户创建vm和docker映像的工具。


packer做的比我需要的更多;我只需要创建ec2 amis。但它仍然做得不够:它没有为ansible角色的快速迭代开发提供一个开发阶段。您总是必须从一个新实例开始


bossimage创建ec2映像,并在创建映像之前提供一个开发阶段,以及在创建映像之前提供一个测试阶段。


但可以使用第三方插件来测试ansible和其他配置管理工具。它可以创建带有流浪者和各种云的vm实例来进行开发。


test kitchen做的比我需要的还多;我只需要在ec2中测试ansible。
但它仍然做得不够:它没有提供ami创建
阶段。

bossimage创建ec2实例并在其上运行ansible,并提供
image创建和图像测试ph例如。

…|构建状态图像::https://travis-ci.org/cloudboss/bossimage.svg?branch=master
:目标:https://travis ci.org/cloudboss/bossimage



欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中ArrayList的超简单问题   Java 8在一段时间后过期   java如何创建具有用户定义维度的矩阵,并使用从上到下、从左到右的递增值填充它?   java从JDBC重启mysql   带有sqlite的java LiveData未更新UI   带有JDialog的java小程序在Mac OSX中未正确隐藏   java ActionListener无法从公共类引用数组?   java Apache Digester:NoSuchMethodException:没有这样的可访问方法   安卓中数据库中的java数据没有以正确的格式检索   java快速排序实现:使用random pivot时几乎排序   安卓 Java:高效的ArrayList过滤?   java如何在单独的文件中制作GUI程序   jasper报告如何从JSP或Java代码在JasperReport中传递参数值?