使用ansible进行多阶段部署
Multistage deployment with ansible
如果您有不同的阶段变量,您建议使用什么方法使用 Ansible 组织多阶段部署?
主要思想是为不同阶段定义组变量。
有两篇文章:
- http://rosstuck.com/multistage-environments-with-ansible/
- http://toja.io/using-host-and-group-vars-files-in-ansible/
我想获得更多有关组织剧本、变量和主机的示例,并了解您的方法的优缺点。
目前我正在使用以下结构:
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 台服务器,它对我来说效果很好。不过,它有一些弱点:
- 虽然在我的例子中,优点超过了那些缺点。我最大的恐惧是忘记限制到其中一个阶段,不小心将主机目录中的所有库存作为目标。如果库存完全分开,那将更容易避免。
- 此外,我不喜欢在
development
或 production
组中再次列出清单中的所有服务器,因为它是多余的且容易忘记。
- 我想如果您的系统不断增长,理解变量加载的位置和顺序可能会有点混乱。
话虽这么说,它对我来说效果很好,所以也许它也适合你。
在库存结构复杂的情况下,当维护组组不是最佳选择时 (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.yml
可以使用 ansible-vault
进行加密
最近,我使用了我在问题中提到的方法,它恰好是我认为最方便的方法之一。
它摘自 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 when provided a directory as the inventory, will search by default a file named inventory
so no need to specify -i production/inventory
, only -i production
will work just fine.
好处是:
您不必维护一些不必要的组,例如[production:children]
您不需要像 group_vars/production.yml
那样混淆组和文件
所有变量和主机都在不同的目录中,因此很容易保持它们的不同,并且更改历史一目了然。如果需要,您甚至可以将其拆分到单独的存储库中
您还可以使用 ansible-vault
在存储库中为生产保密,换句话说,将所有重要变量加密存储
如果您有不同的阶段变量,您建议使用什么方法使用 Ansible 组织多阶段部署?
主要思想是为不同阶段定义组变量。
有两篇文章:
- http://rosstuck.com/multistage-environments-with-ansible/
- http://toja.io/using-host-and-group-vars-files-in-ansible/
我想获得更多有关组织剧本、变量和主机的示例,并了解您的方法的优缺点。
目前我正在使用以下结构:
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 台服务器,它对我来说效果很好。不过,它有一些弱点:
- 虽然在我的例子中,优点超过了那些缺点。我最大的恐惧是忘记限制到其中一个阶段,不小心将主机目录中的所有库存作为目标。如果库存完全分开,那将更容易避免。
- 此外,我不喜欢在
development
或production
组中再次列出清单中的所有服务器,因为它是多余的且容易忘记。 - 我想如果您的系统不断增长,理解变量加载的位置和顺序可能会有点混乱。
话虽这么说,它对我来说效果很好,所以也许它也适合你。
在库存结构复杂的情况下,当维护组组不是最佳选择时 (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.yml
可以使用 ansible-vault
最近,我使用了我在问题中提到的方法,它恰好是我认为最方便的方法之一。
它摘自 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 when provided a directory as the inventory, will search by default a file named
inventory
so no need to specify-i production/inventory
, only-i production
will work just fine.
好处是:
您不必维护一些不必要的组,例如
[production:children]
您不需要像
group_vars/production.yml
那样混淆组和文件
所有变量和主机都在不同的目录中,因此很容易保持它们的不同,并且更改历史一目了然。如果需要,您甚至可以将其拆分到单独的存储库中
您还可以使用 ansible-vault
在存储库中为生产保密,换句话说,将所有重要变量加密存储