有没有一种方法可以让剧本等到定义变量之后?
为了减少执行剧本的时间,我想将其拆分为多个并同时启动它们。其中一些需要一个变量,该变量在其他手册中定义。
有可能吗?
答案 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