【问题标题】:Why Ansible doesn't read the templates in relative path?为什么 Ansible 不读取相对路径中的模板?
【发布时间】:2014-07-03 16:37:23
【问题描述】:

我正在使用 Ansible,但模板路径存在一些问题。这是我执行时的错误输出:

$ ansible-playbook -i hosts site.yml 

PLAY [users] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [10.0.3.240]

TASK: [templates] ************************************************************* 
fatal: [10.0.3.240] => {'msg': 'unable to read /home/robe/Desktop/ansible_demo/fig.conf.j2', 'failed': True}
fatal: [10.0.3.240] => {'msg': 'unable to read /home/robe/Desktop/ansible_demo/fig.conf.j2', 'failed': True}

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/robe/site.retry

10.0.3.240                 : ok=1    changed=0    unreachable=1    failed=0 

这是我的项目结构:

$ tree
.
├── ansible.cfg
├── hosts
├── roles
│   └── users
│       ├── files
│       ├── handlers
│       │   └── main.yml
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       │   └── fig.conf.j2
│       └── vars
│           └── main.yml
├── site.yml
└── Vagrantfile

这是我的 site.yml 代码:

---
- hosts: users
  remote_user: root
  sudo: True
  tasks:
  - name: templates
    template: src="fig.conf.j2" dest="/home/vagrant/fig.conf"

那么,为什么 Ansible 不查看模板目录,而只查看根目录。

【问题讨论】:

  • 你为什么不从 users/tasks/main.yml 调用templatefig.conf 显然是 users 角色的一部分。

标签: ansible


【解决方案1】:

当您明确使用角色“用户”时,Ansible 只会在角色/用户/模板目录中查找,而您在示例中并未使用该角色。要执行您想要的操作,您需要将您的 site.yml 更改为如下所示:

- hosts: users
  remote_user: root
  sudo: True
  roles:
    - { role: users }

然后在角色/用户/任务/main.yml 中,您将拥有:

- name: templates
  template: src="fig.conf.j2" dest="/home/vagrant/fig.conf"

site.yml 中的角色告诉 Ansible 调用 yaml 文件角色/用户/任务/main.yml。默认情况下,引用该角色内的文件或模板的任务将在角色/用户/文件和角色/用户/模板中查找这些文件/模板。您可能想在Ansible documentation 中阅读有关角色的更多信息,以确保您更好地了解它们如何组合在一起。

【讨论】:

    【解决方案2】:

    如果你想从site.yml访问“fig.conf.j2”模板文件,你需要在site.yml之外创建一个模板目录,并将文件“fig.conf.j2”放入其中。

    根据您当前的目录结构,因为模板目录位于角色内部。您需要从该角色内的 tasks/main.yml 访问模板

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多