使用ansible进行多级部署

时间:2015-09-11 15:15:59

标签: deployment environment-variables ansible multistage

如果您有不同的阶段变量,您建议采用什么方法组织多级部署和ansible?

主要思想是为不同阶段定义组变量。

有两个技巧:

我希望获得更多关于组织剧本,变量,主持人以及了解您的方法的优缺点的例子。

3 个答案:

答案 0 :(得分:16)

最近,我使用了我在问题中已经提到过的方法,这是我心目中最方便的方法之一。

它来自Organizing Group Vars Files in Ansible文章,但略有改动,因为,不幸的是,文章的标题并未反映它的真实价值和目的,并且剧本的名称也令人困惑。 实际上,花了很长时间才意识到它是关于使用Ansible进行多阶段部署

您的布局目录应该是这样的:

production/
├── group_vars
│   └── server.yml
└── inventory
staging/
├── group_vars
│   └── server.yml
└── inventory
deploy.yml

用法非常简单:

ansible-playbook -i staging deploy.yml

deploy.yml是您的剧本的名称。

  

Ansible-playbook在提供目录作为清单时,默认会搜索名为inventory的文件,因此无需指定-i production/inventory,只有-i production才能正常工作。

好处是:

  • 您不必保留一些不必要的群体,例如[production:children]

  • 您无需像group_vars/production.yml

  • 那样混淆群组和文件
  • 所有变量和主机都在不同的目录中,因此很容易保持它们不同,并且变化的历史记录很清楚。如果需要,您甚至可以将其拆分为单独的存储库

您还可以使用ansible-vault在存储库中保留生产密码,换句话说,将所有重要变量存储为加密

答案 1 :(得分:4)

如果库存结构复杂,维护组组不是最佳选择(http://docs.ansible.com/ansible/intro_inventory.html#groups-of-groups-and-group-variables),可以使用以下技巧:

生产库存文件:

# production inventory 
[loadbalancers]
lb01
lb02
lb03

[webservers]
ws01
ws02
ws03

[all:vars]
inventory_vars=prod.config.yml

开发清单文件:

# development inventory 
[loadbalancers]
test-lb01
test-lb02
test-lb03

[webservers]
test-ws01
test-ws02
test-ws03

[all:vars]
inventory_vars=development.config.yml

现在在playbook中,在加载角色之前包括以下任务:

- hosts: all

  pre_tasks:

    - name: Load inventory specific variables
      include_vars: "{{ inventory_vars }}"

为防止在生产环境中意外执行Playbook,prod.config.yml cab应使用ansible-vault加密

答案 2 :(得分:3)

目前我使用以下结构:

hosts/development
hosts/production
hosts/group_vars/development/service1.yml
hosts/group_vars/development/service2.yml
hosts/group_vars/production/service1.yml
hosts/group_vars/production/service2.yml
hosts/group_vars/production/service3.yml
hosts/host_vars/dev1.yml
hosts/host_vars/prod1/something.yml
hosts/host_vars/prod1/something_else.yml

库存可能如下所示:

# hosts/development

dev1 ansible_ssh_host=dev1.example.com
dev2 ansible_ssh_host=dev2.example.com

[development]
dev1
dev2

[service1]
dev1

[service2]
dev2

[service3]
dev1
dev2

生产:

# hosts/production

prod1 ansible_ssh_host=prod1.example.com
prod2 ansible_ssh_host=prod2.example.com

[production]
prod1
prod2

[service1]
prod1

[service2]
prod2

[service3]
prod1
prod2

这允许一些很好的组合。通过使用ansible -i hosts,我可以定位所有已知主机。例如,我使用它将库存中的所有服务器添加到监控配置文件中。

通过使用ansible -i hosts/development,我可以将命令限制为开发(或生产)服务器。我想在开发系统上测试新配置,然后再将其应用到生产环境中之前就这样做了。

我目前在3个不同的舞台上为大约25台服务器使用这种结构,它对我来说非常好用。但它有一些缺点:

  • 虽然在我看来,优势超过了这些弱点。我最大的担心是忘记限制其中一个阶段,意外地瞄准主机目录中的所有库存。如果库存完全分开,那将更容易避免。
  • 此外,我不想在developmentproduction群组中再次列出广告资源中的所有服务器,因为它是多余且容易忘记的。
  • 我想如果你的系统增长了,那么从哪里以及在哪个顺序加载变量来理解它可能会有点混乱。

话虽这么说,它对我来说效果很好,所以也许对你来说效果很好。