如何等待变量被定义?

时间:2019-06-11 08:24:02

标签: ansible

有没有一种方法可以让剧本等到定义变量之后?

为了减少执行剧本的时间,我想将其拆分为多个并同时启动它们。其中一些需要一个变量,该变量在其他手册中定义。

有可能吗?

1 个答案:

答案 0 :(得分:1)

恕我直言,这是不可能的。 Global scope仅由配置,环境变量和命令行设置。

其他变量在播放范围内共享。可以使用import_playbook将更多剧本导入一个剧本,并在这些剧本之间共享变量。但是,不可能让导入的剧本运行asynchronously并让它们彼此等待。

一种选择是使用外部共享内存(例如数据库)并单独启动此类剧本。例如,要在控制器上的剧本之间共享变量,一个简单的ini文件即可完成这项工作。

$ cat shared-vars.ini
[global]

下面的剧本

- hosts: localhost
  tasks:
    - wait_for:
        path: "{{ playbook_dir }}/shared-vars.ini"
        search_regex: "^shared_var1\\s*=(.*)"
    - debug:
        msg: "{{ lookup('ini', 'shared_var1 file=shared-vars.ini') }}"

等待文件 shared-vars.ini

中的变量 shared_var1
$ ansible-playbook wait_for_var.yml

PLAY [localhost] *******************************************************

TASK [wait_for] ********************************************************

下一本书

- hosts: localhost
  tasks:
    - ini_file:
        path: "{{ playbook_dir }}/shared-vars.ini"
        section: global
        option: shared_var1
        value: Test value set by declare_var.yml

将变量 shared_var1 写入文件 shared-vars.ini

$ ansible-playbook declare_var.yml

PLAY [localhost] *******************************************************

TASK [ini_file] ********************************************************
changed: [localhost]

PLAY RECAP *************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0

等待变量的第一个剧本继续

TASK [debug] ***********************************************************
ok: [localhost] => {
    "msg": "Test value set by declare_var.yml"
}

PLAY RECAP *************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0