为什么Ansible没有在变量中看到属性?

UsC*_*sCr 5 linux ubuntu debian ansible

我有一个简单任务的Ansible角色"db":

- name: Check repos
  apt_repository: repo="{{ item.repo }}" state={{ item.state }}
  with_items:
  - "{{ apt_repos }}"
Run Code Online (Sandbox Code Playgroud)

在/defaults/mail.yml中:

apt_repos:

   # Percona
 - { state: present, repo: 'deb http://repo.percona.com/apt wheezy main', keyserver: 'keyserver.ubuntu.com', key: '1C4CBDCDCD2EFD2A', needkey: True }
 - { state: present, repo: 'deb-src http://repo.percona.com/apt wheezy main', needkey: False }
Run Code Online (Sandbox Code Playgroud)

当我尝试运行这个ansible-playbook时:

---
- hosts: test
  roles:
  - db
Run Code Online (Sandbox Code Playgroud)

我看到错误:

fatal: [10.10.10.10] => One or more undefined variables: 'unicode object' has no attribute 'repo'

FATAL: all hosts have already failed -- aborting
Run Code Online (Sandbox Code Playgroud)

但我有另一个角色,具有相同的任务和变量,它完美地工作.怎么了?

Bru*_*e P 6

你想这样做:

with_items: apt_repos
Run Code Online (Sandbox Code Playgroud)

apt_repos是一个列表.通过引用它作为- "{{ apt_repos }}"额外-的将其变成列表列表.在这种情况下,您也不需要引号或括号 - 在这种情况下,这些几乎都是多余的.

  • 在Ansible 2.1中,也许更早,这可行,但由于使用'裸变量'`apt_repos`而给出了弃用警告.要避免这种情况,请使用`with_items:"{{apt_repos}}"`. (5认同)