我的任务:生成jinja2模板
挑战:我想使我的剧本/角色独立,并且可以在任何服务器中使用,而不管其HOME目录名称如何,因此我将$ HOME路径存储在一个变量中,并使用该目录位置变量来访问jinja2源文件。 。$ HOME存储的变量在所有任务中都可以正常工作,但是在template
模块内使用它时出现错误”
我的角色结构..
roles/
└── my_role
├── defaults
│ ├── main
│ │ └── input.yml
│ └── main.yml
├── files
│ ├── conf
│ │ └── test.yml
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ ├── data-input.yml
│ ├── main.yml
├── templates
│ ├── DIR1
│ │ ├── PATH1
│ │ │ ├── file1
├── tests
│ ├── inventory
│ └── test.yml
└── vars
├── main
│ └── input.yml
└── main.yml
还有我的生成jinja2模板的任务。
---
- include_vars: vars/main/input.yml
- name: Generate templates
template:
src: {{ home }}/roles/my_role/templates/DIR1/PATH1/file1
dest: {{ home }}/roles/my_role/templates/DIR1/PATH1/file2
{{ home }}
代表/home/ansible
,我已使用$ HOME linux变量将其存储为名称home
。
遇到错误:
ERROR! Syntax Error while loading YAML.
did not find expected key
The error appears to be in '/home/ansible/roles/my_role/tasks/data_input.yml': line 6, column 24, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
template:
src: {{ home }}/roles/my_role/templates/DIR1/PATH1/file1
^ here
我什至只尝试过templates/DIR1/PATH1/file1
目录。但没有运气。
当我在/home/ansible/roles/my_role/templates/DIR1/PATH1/file1
和src
中都指定完整目录路径dest
时,它工作正常。
请帮助。
先谢谢了。
答案 0 :(得分:2)
规则:在一个Yaml文件中(角色中包含您的剧本...。),values containing jinja2 template expressions and starting with "{{" MUST be enclosed in quotes。
良好做法:将任何包含jinja2模板表达式的字符串括在引号中。
=>
src: "{{ home }}/roles/my_role/templates/DIR1/PATH1/file1"
dest: "{{ home }}/roles/my_role/templates/DIR1/PATH1/file2"
答案 1 :(得分:0)
使用env插件“读取环境变量的值”。例如
- set_fact:
my_home: "{{ lookup('env','HOME') }}"
- template:
src: "{{ my_home }}/roles/my_role/templates/DIR1/PATH1/file1"
1)可以使用role_path特殊变量
“当前正在运行的角色的目录的路径”
例如
src: '{{ role_path }}/templates/DIR1/PATH1/file1'
2)但是,由于The magic of ‘local’ paths
,这不是必需的”“首先尝试相对路径并附加'files | templates | vars'(如果尚不存在),根据所采取的操作,'files'是默认值。(即include_vars将使用vars / )。路径将从最具体到最一般(即扮演角色)搜索。|
因此,默认情况下,下面的路径显示了工作
src: 'DIR1/PATH1/file1'
例如角色
$ tree roles/test14/
roles/test14/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
│ └── DIR1
│ └── PATH1
│ └── file1
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
$ cat roles/test14/tasks/main.yml
- template:
src: 'DIR1/PATH1/file1'
dest: '/scratch/tmp/test14'
$ cat roles/test14/templates/DIR1/PATH1/file1
{{ inventory_hostname }}
使用剧本
$ cat test14.yml
- hosts: localhost
roles:
- test14
按预期工作
PLAY RECAP 本地主机:ok = 2更改= 1不可达= 0失败= 0跳过= 0拯救了= 0忽略了= 0
$ cat /scratch/tmp/test14
localhost