ansible - 如何在 Ansible 中有效地使用主机组
问题描述
我正在为我的部署编写一个 ansible 脚本,但遇到了一个问题。我有 6 个 tomcat 节点,我在其中进行了滚动部署,即首先在 3 个节点上部署并对其进行测试。如果测试成功,则选择剩余的 3 个节点。我目前的库存看起来像这样 -
[prod]
prod-1-myapp
prod-2-myapp
prod-3-myapp
prod-4-myapp
prod-5-myapp
prod-6-myapp
[preprod]
preprod-cn-p1
我正在使用 group_vars 我必须prod.yml/preprod.yml
在运行时上传配置。是否可以将此主机组分成 2 个并相应地部署在每个主机组上。prod.yml
如果我像下面这样创建 2 个主机组,我如何在运行时使用我的。它将如何运作?
[prod-1]
prod-1-myapp
prod-2-myapp
prod-3-myapp
[prod-2]
prod-4-myapp
prod-5-myapp
prod-6-myapp
[preprod]
preprod-cn-p1
我当前的查询 -
ansible-playbook myapp-main.yml -e myapp_release_version=5.0.0 -e target_env=prod
myapp-main.yml
---
- name: Starting with Myapp Application deployment to tomcat nodes
hosts: '{{ target_env }}'
gather_facts: True
any_errors_fatal: true
roles:
- role: deploy
tags:
- deploy
become: yes
become_user: tomcat
become_method: sudo
请如果有人可以建议。任何帮助表示赞赏
解决方案
Q:“在3个节点上部署并测试。如果测试成功,再去剩下的3个节点。” (使用 group_vars prod .yml / preprod .yml)
A :Makeprod_1
和.prod_2
_ 例如prod
shell> cat hosts
[prod_1]
prod-1-myapp
prod-2-myapp
prod-3-myapp
[prod_2]
prod-4-myapp
prod-5-myapp
prod-6-myapp
[prod:children]
prod_1
prod_2
[preprod]
preprod-cn-p1
然后部署组prod_1
。如果一切正常,请部署prod_2
。例如,下面的剧本
shell> cat playbook.yml
- import_playbook: myapp-main.yml
vars:
target_env: prod_1
- hosts: localhost
gather_facts: false
tasks:
- fail:
msg: Test prod_1 failed
when: prod_1_failed|default(false)|bool
- import_playbook: myapp-main.yml
vars:
target_env: prod_2
shell> cat myapp-main.yml
- hosts: '{{ target_env }}'
gather_facts: false
tasks:
- debug:
msg: "Deploy {{ inventory_hostname }}"
给
PLAY [prod_1] ****
TASK [debug] ****
ok: [prod-2-myapp] => {
"msg": "Deploy prod-2-myapp"
}
ok: [prod-1-myapp] => {
"msg": "Deploy prod-1-myapp"
}
ok: [prod-3-myapp] => {
"msg": "Deploy prod-3-myapp"
}
PLAY [localhost] ****
TASK [fail] ****
skipping: [localhost]
PLAY [prod_2] ****
TASK [debug] ****
ok: [prod-4-myapp] => {
"msg": "Deploy prod-4-myapp"
}
ok: [prod-5-myapp] => {
"msg": "Deploy prod-5-myapp"
}
ok: [prod-6-myapp] => {
"msg": "Deploy prod-6-myapp"
}
失败prod_2
时不应部署该组。prod_1
测试一下。例如
shell> ansible-playbook -i hosts playbook.yml -e "prod_1_failed=True"
给
PLAY [prod_1] ****
...
PLAY [localhost] ****
TASK [fail] ****
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Test prod_1 failed"}
...