首页 > 解决方案 > 在 ansible 中获取 Caller Playbook 目录名称

问题描述

我有两本剧本pb1.ymldir/pb2.yml. 我pb2.ymlpb1.yml剧本打电话。我需要打印调用pb2.yml剧本的目录的名称。

cat pb1.yml
---
  - hosts: localhost
    tasks:
      - debug: var={{ playbook_dir |basename }}

  - import_playbook: dir/pb2.yml

cat dir/pb2.yml
---
  - hosts: localhost
    tasks:
      - debug: var={{ playbook_dir |basename }}

在下面的示例中,我能够获取的目录名称,pb2.yml但我有兴趣知道pb1.ymlfrom的目录名称pb2.yml

home/monk>ansible-playbook pb1.yml
PLAY [localhost] *******************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
    "samples": "VARIABLE IS NOT DEFINED!"
}

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

TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ***********************************************************************************************************************************************************
ok: [localhost] => {
    "dir": "VARIABLE IS NOT DEFINED!"
}

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

预期结果:

来自 pb2.yml,打印/home/monk/

标签: ansible

解决方案


变量被正确扩展并且使用参数打印的值msg

  - debug:
      msg: "{{ playbook_dir|basename }}"

, 或者变量var不带扩展打印参数

  - debug:
      var: playbook_dir|basename


解释

代码{{ playbook_dir|basename }}分别计算为“sample”或“dir”

tasks:
  - debug: var={{ playbook_dir|basename }}

此类变量未定义,播放将失败

"samples": "VARIABLE IS NOT DEFINED!

从调试中引用

var:要调试的变量名。与 msg 选项互斥。请注意,此选项已在 Jinja2 上下文中运行并具有隐式 {{ }} 包装,因此除非您正在寻找双插值,否则不应使用 Jinja2 分隔符

“双插值”实际上是“间接寻址”。下面的戏

- hosts: localhost
  vars:
    x: y
    y: z
  tasks:
    - debug:
        var: "{{ x }}"

ok: [localhost] => {
    "y": "z"
}

推荐阅读