ansible:使用变量指定目录路径

时间:2019-12-09 09:04:43

标签: ansible jinja2

我的任务:生成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/file1src中都指定完整目录路径dest时,它工作正常。

请帮助。

先谢谢了。

2 个答案:

答案 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