我们使用 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可能知道执行的任务并且不再验证它们的某种方式,这可能吗?
例如在下面的项目中
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