ansible-playbook + 如何忽略已经在 pb.yml 中执行的任务

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

我们使用 ansible 来在 Linux 机器上安装我们的应用程序和配置

这是

general.pb.yml

的示例
#-----------------------------------------------------------------------------
# java apps installtion
#-----------------------------------------------------------------------------
- import_playbook: /deployment/application/stage1.pb.yml
- import_playbook: /deployment/application/stage2.pb.yml
- import_playbook: /deployment/application/stage3.pb.yml
- import_playbook: /deployment/application/stage4.pb.yml
- import_playbook: /deployment/application/stage5.pb.yml
- import_playbook: /deployment/application/stage6.pb.yml
- import_playbook: /deployment/application/stage7.pb.yml
- import_playbook: /deployment/application/stage8.pb.yml
- import_playbook: /deployment/application/stage9.pb.yml
- import_playbook: /deployment/application/stage10.pb.yml
- import_playbook: /deployment/application/stage11.pb.yml

。 。 。 .

问题是,当我们一次又一次地运行

pb.yml
2 次或 3 次时,这意味着将时间花在已经执行的任务上

我举个例子

假设我们运行 ansible-playbook

general.pb.yml
并且我们只想执行之前未正确执行的任务 -
/deployment/application/stage8.pb.yml
在这种情况下,ansible 将验证从
stage1.pb.yml
stage7.pb.yml
的所有阶段,并且会花费 10 分钟左右的时间,直到 ansible 以
/deployment/application/stage8.pb.yml

开始

我们作为工人所做的事情我们评论如下

#-----------------------------------------------------------------------------
# java apps installtion
#-----------------------------------------------------------------------------
#- import_playbook: /deployment/application/stage1.pb.yml
#- import_playbook: /deployment/application/stage3.pb.yml
#- import_playbook: /deployment/application/stage4.pb.yml
#- import_playbook: /deployment/application/stage5.pb.yml
#- import_playbook: /deployment/application/stage6.pb.yml
#- import_playbook: /deployment/application/stage7.pb.yml
- import_playbook: /deployment/application/stage8.pb.yml
- import_playbook: /deployment/application/stage9.pb.yml
- import_playbook: /deployment/application/stage10.pb.yml
- import_playbook: /deployment/application/stage11.pb.yml

然后再次运行

general.pb.yml

但我要问的是,ansible可能知道执行的任务并且不再验证它们的某种方式,这可能吗?

linux ansible
1个回答
0
投票

例如在下面的项目中

shell> tree .
.
├── ansible.cfg
├── group_vars
│   └── all
│       └── stages.yml
├── hosts
├── init.yml
├── pb.yml
├── stage1.yml
├── stage2.yml
├── stage3.yml
├── stage4.yml
└── stage5.yml

创建通用剧本

shell> cat pb.yml 
- import_playbook: stage1.yml
  when: stage1|d(false)|bool
- import_playbook: stage2.yml
  when: stage2|d(false)|bool
- import_playbook: stage3.yml
  when: stage3|d(false)|bool
- import_playbook: stage4.yml
  when: stage4|d(false)|bool
- import_playbook: stage5.yml
  when: stage5|d(false)|bool

注意:您可以生成剧本

shell> cat init.yml 
- hosts: localhost

  tasks:

    - copy:
        dest: pb.yml
        content: |
          {% for i in range(1,no_of_stages|d(1)|int + 1) %}
          - import_playbook: stage{{ i }}.yml
            when: stage{{ i }}|d(false)|bool
          {% endfor %}

以及测试各个阶段的剧本

shell> cat stage1.yml 
- name: stage 1
  hosts: all

  tasks:

    - debug:
        var: ansible_play_name

默认情况下,剧本不执行任何操作。所有导入都将被跳过。您可以自行声明默认值。例如,

shell> cat group_vars/all/stages.yml 
stage1: true
stage2: true
stage3: true
stage4: true
stage5: true

现在,默认情况下,所有阶段都将被执行

shell> ansible-playbook -l localhost pb.yml

PLAY [stage 1] ******************************************************************************************************

TASK [debug] ********************************************************************************************************
ok: [localhost] => 
  ansible_play_name: stage 1

PLAY [stage 2] ******************************************************************************************************

TASK [debug] ********************************************************************************************************
ok: [localhost] => 
  ansible_play_name: stage 2

PLAY [stage 3] ******************************************************************************************************

TASK [debug] ********************************************************************************************************
ok: [localhost] => 
  ansible_play_name: stage 3

PLAY [stage 4] ******************************************************************************************************

TASK [debug] ********************************************************************************************************
ok: [localhost] => 
  ansible_play_name: stage 4

PLAY [stage 5] ******************************************************************************************************

TASK [debug] ********************************************************************************************************
ok: [localhost] => 
  ansible_play_name: stage 5

PLAY RECAP **********************************************************************************************************
localhost: ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

这个框架的使用很简单。例如,如果您想禁用前两个阶段

shell> ansible-playbook -l localhost pb.yml -e stage1=false -e stage2=false
© www.soinside.com 2019 - 2024. All rights reserved.