4

ansible 是否将角色默认变量传递给同一角色中的处理程序?

这是有问题的剧本的一小段摘录:

角色层次结构

- playbook.yml
- roles/
  - gunicorn/
    - defaults/
      - main.yml
    - handlers/
      - main.yml
  - code-checkout/
    - tasks/
      - main.yml

这是文件内容

gunicorn/defaults/main.yml

---
gu_log: "/tmp/gunicorn.log"

gunicorn/handlers/main.yml

---
- name: Clear Gunicorn Log
  shell: rm {{ gu_log }}

完成/任务/main.yml

---
- name: Test Handlers
  shell: ls
  notify:
    - Restart Gunicorn

剧本.yml

---
  - name: Deploy
    hosts: webservers
    tasks:
      - include: roles/finalize/tasks/main.yml
    handlers:
      - include: roles/gunicorn/handlers/main.yml

AFAIK 一切看起来都很好。但是,我在剧本执行期间收到此错误

失败的!=> {"failed": true, "msg": "字段 'args' 的值无效,似乎包含一个未定义的变量。错误是:'gu_log' 未定义\n\n错误似乎是已在 '/roles/gunicorn/handlers/main.yml': 第 3 行第 3 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\ n\n- 名称:重新启动 Gunicorn\n ^ 此处\n"}

在 Ubuntu 12.04 LTS 上使用 Ansible 2.2

这是创建所有目录并演示我的问题的 techraf 脚本的修改版本

#!/bin/bash

mkdir -p ./rtindru-test/roles/gunicorn
mkdir -p ./rtindru-test/roles/gunicorn/defaults
mkdir -p ./rtindru-test/roles/gunicorn/handlers
mkdir -p ./rtindru-test/roles/finalize/tasks

cat >./rtindru-test/roles/finalize/tasks/main.yml <<HANDLERS_END
---
- name: Test Handlers
  shell: rm {{ gu_log }}
HANDLERS_END

cat >./rtindru-test/roles/gunicorn/handlers/main.yml <<HANDLERS_END
---
- name: Clear Gunicorn Log
  shell: rm {{ gu_log }}
HANDLERS_END

cat >./rtindru-test/roles/gunicorn/defaults/main.yml <<DEFAULTS_END
---
gu_log: "/tmp/gunicorn.log"
DEFAULTS_END

cat >./rtindru-test/playbook.yml <<PLAYBOOK_END
---
  - name: Deploy
    hosts: localhost
    tasks:
      - include: roles/finalize/tasks/main.yml
    handlers:
      - include: roles/gunicorn/handlers/main.yml
PLAYBOOK_END

touch /tmp/gunicorn.log
ls -l /tmp/gunicorn.log
ansible-playbook ./rtindru-test/playbook.yml
ls -l /tmp/gunicorn.log

输出

PLAY [部署]


任务 [设置] ********************************************** ************************ 好的:[本地主机]

任务 [测试处理程序] ************************************************ **************致命:[本地主机]:失败!=> {"failed": true, "msg": "字段 'args' 的值无效,似乎包含一个未定义的变量。错误是:'gu_log' 未定义\n\n错误似乎是已在“/rtindru-test/roles/finalize/tasks/main.yml”:第 2 行第 3 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\n---\n- name: Test Handlers\n ^ here\n"} 重试,使用:--limit @/rtindru-test/playbook.retry

播放回顾 ************************************************ ************************ 本地主机:正常=1 更改=0 无法访问=0
失败=1

4

1 回答 1

2

您既没有定义也没有使用任何角色。执行以下任务:

- include: roles/finalize/tasks/main.yml

你只是在你的剧本中包含一个任务文件。它与角色无关。

要分配一个角色,您应该指定一个角色的列表(一个或多个):

role:
  - my_role1
  - my_role2

请查看有关角色的文档,并随意使用由以下脚本创建的剧本和结构。

ansible 是否将角色默认变量传递给同一角色中的处理程序?

是的,它确实。

为了证明,请运行以下 bash 脚本,该脚本创建并运行一个最小示例。它完整​​地获取问题的内容gunicorn/defaults/main.ymlgunicorn/handlers/main.yml来自问题的内容,并添加缺失的组件:任务和剧本。它创建一个要删除的文件并运行 playbook。

#!/bin/bash

mkdir -p ./so41285033/roles/gunicorn
mkdir -p ./so41285033/roles/gunicorn/defaults
mkdir -p ./so41285033/roles/gunicorn/handlers
mkdir -p ./so41285033/roles/gunicorn/tasks

cat >./so41285033/roles/gunicorn/tasks/main.yml <<TASKS_END
---
- debug:
  changed_when: true
  notify: Clear Gunicorn Log
TASKS_END

cat >./so41285033/roles/gunicorn/handlers/main.yml <<HANDLERS_END
---
- name: Clear Gunicorn Log
  shell: rm {{ gu_log }}
  when: "'apiservers' not in group_names"
HANDLERS_END

cat >./so41285033/roles/gunicorn/defaults/main.yml <<DEFAULTS_END
---
gu_log: "/tmp/gunicorn.log"
DEFAULTS_END

cat >./so41285033/playbook.yml <<PLAYBOOK_END
---
- hosts: localhost
  gather_facts: no
  connection: local
  roles:
    - gunicorn
PLAYBOOK_END

touch /tmp/gunicorn.log
ls -l /tmp/gunicorn.log
ansible-playbook ./so41285033/playbook.yml
ls -l /tmp/gunicorn.log

结果:

-rw-r--r--  1 techraf  wheel  0 Dec 23 07:57 /tmp/gunicorn.log
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available


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

TASK [gunicorn : debug] ********************************************************
ok: [localhost] => {
    "msg": "Hello world!"
}

RUNNING HANDLER [gunicorn : Clear Gunicorn Log] ********************************
changed: [localhost]
 [WARNING]: Consider using file module with state=absent rather than running rm


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

ls: /tmp/gunicorn.log: No such file or directory

解释:

  • 在运行 playbook 之前,/tmp/gunicorn.log已创建文件并验证其存在:

    -rw-r--r--  1 techraf  wheel  0 Dec 23 07:57 /tmp/gunicorn.log
    
  • 运行剧本后,文件/tmp/gunicorn.log不存在:

    ls: /tmp/gunicorn.log: No such file or directory
    
  • Ansible 正确地将变量gu_log值传递给Clear Gunicorn Log删除文件的处理程序。

最后的评论:

所描述的问题无法重现,因为该问题不包含MCVE含义中的完整可验证示例。

于 2016-12-22T23:01:17.720 回答