如何在 Ansible 中有效使用主机组

问题描述 投票:0回答:3

我正在为我的部署编写一个 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 个并相应地部署在每个主机组上。 如果我创建如下所示的 2 个主机组,我如何在运行时使用我的
prod.yml
。它将如何运作?

[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

请有人提供建议。任何帮助表示赞赏

ansible ansible-inventory
3个回答
3
投票

问:“部署在 3 个节点上并进行测试。如果测试成功,则继续部署其余 3 个节点。”(使用 group_vars prod.yml / preprod.yml)

A:使

prod_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"}

  ...


2
投票

你基本上就快到了。
拆分库存,使用

-e target_env=prod-1
运行,检查它是否有效,然后使用
-e target_env=prod-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

[prod:children]
prod_1
prod_2

应在所有六个产品服务器上共享的所有组变量都需要分配给该组

prod


0
投票

前言: 我强烈建议不要使用像

target_env
这样的 var 来定位特定的主机或组。这通常扩展性很差。有一些专门针对您的主机而构建的功能。请参阅 Ansible 库存指南

解决方案:

我相信

serial
关键字可以帮助实现这种滚动部署方式。

为您的生产应用程序定义一个主机组。

在生产应用程序部署的剧本中,使用

hosts: prod
添加
serial: 50%
,这将针对一半的生产库存执行剧本,然后在第一个成功后执行下一半。

串行运行将继续到下一批,除非上一批中的所有主机都出现故障。如果您想降低此阈值,并说,如果第一批中任何主机失败,则终止 playbook,请在您的 playbook 中使用

any_errors_fatal: true
(我看到您已经在使用了)。

此外,如果任何串行批处理运行的主机百分比失败,则可以使用

max_fail_percentage
关键字来终止 playbook。

即。如果任何一批主机中有一半在串行运行中失败,

max_fail_percentage: 50%
将终止 playbook 执行。

示例:

[prod]
prod-1-myapp
prod-2-myapp
prod-3-myapp
prod-4-myapp
prod-5-myapp
prod-6-myapp

[preprod]
preprod-cn-p1
---
 - name: Starting with  Myapp Application deployment to tomcat nodes
   hosts: prod
   serial: 50%
   any_errors_fatal: true
   gather_facts: true
   roles:
     - role: deploy
       tags:
         - deploy
       become: yes
       become_user: tomcat
       become_method: sudo

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.