7
4

3 回答 3

17

最近,我使用了我在问题中已经提到的方法,它似乎是我认为最方便的方法之一。

它取自在 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

  • 所有 vars 和 hosts 都在不同的目录中,因此很容易使它们保持不同,并且更改历史记录很清楚。如果需要,您甚至可以将其拆分为单独的存储库

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

于 2016-07-13T10:40:14.450 回答
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

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

- hosts: all

  pre_tasks:

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

为了防止在生产环境中意外执行 playbook,prod.config.ymlcab 被加密ansible-vault

于 2015-09-14T16:21:43.003 回答
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 台服务器上使用这种结构,它对我来说效果很好。但是,它有一些弱点:

  • 尽管在我的情况下,优势超过了这些劣势。我最大的担心是不小心将主机目录中的所有库存作为目标,因为忘记限制到其中一个阶段。如果库存完全分开,这将更容易避免。
  • 另外,我不喜欢在developmentorproduction组中再次列出清单中的所有服务器,因为它是多余的并且容易忘记。
  • 我想如果你的系统增长它可能会变得有点令人困惑,以了解从何处以及以何种顺序加载变量。

话虽如此,它对我来说效果很好,所以也许它对你也很有效。

于 2015-09-12T19:06:07.510 回答