簡體   English   中英

Ansible 2.8 角色 - 使用 vars/main 目錄

[英]Ansible 2.8 Roles - using the vars/main directory

我正在嘗試將我的 Ansible 角色變量拆分為多個文件 - 根據這個答案,應該可以創建一個vars/main目錄,並且應該自動加載該目錄中的所有 .yml 文件。

但是,在我的情況下似乎沒有發生這種情況。

我的目錄結構:

vars
└── main
    ├── gce_settings.yml
    ├── vsphere_settings.yml
    └── vsphere_zone.yml

但是,當我嘗試使用 vsphere_settings.yml 中定義的變量時,Ansible 抱怨該變量未定義: {"msg": "The task includes an option with an undefined variable. The error was: 'vsphere_user' is undefined

如果我將變量聲明移動到vars/main.yml中,一切都會按預期工作。 但是,當然,我更願意將我的變量分成多個文件。

我在官方 Ansible 文檔中找不到對此“功能”的任何引用,我不知道如何對其進行故障排除。 誰能指出我正確的方向?

我的 ansible 版本: Ubuntu 16.04 上的ansible 2.8.5

在你問之前:是的,我確實確保在嘗試加載vars/main/*.ymlmain.yml不存在......

TL;DR 版本:這是 ansible 中的一個錯誤,由vars/main中存在 empty.yml 文件引起。 已經有一個 PR 了。 這里

實際結果(如評論中所述)實際上取決於文件的處理順序(默認情況下,看起來我的 Ansible 按字母順序處理它們 - 但這可能取決於版本或底層操作系統):

  • 如果首先處理空文件,您會收到一條錯誤消息: ERROR, failed to combine variables, expected dicts but got a 'NoneType' and a 'AnsibleMapping'
  • 如果空文件在其他文件之后處理,則沒有錯誤信息,但是此時已經設置的所有變量都被銷毀了

更多詳細信息:由於我不知道如何在 Ansible 本身中解決此問題,因此我轉到代碼並開始添加print語句以查看發生了什么。

就我而言,我在vars/main目錄中有一些 empty.yml 文件(我計划稍后填充的文件。嗯......看起來當代碼遇到這樣一個空文件時,它會破壞整個字典到目前為止它已經建成。

要么我錯過了一些非常重要的東西,要么這是一個錯誤......重現的步驟:

  • 創建角色
  • 創建vars/main目錄,並用 some.yml 文件填充它
  • 添加一個 empty.yml 文件(命名以便在其他文件之后處理它)
  • 嘗試從第一個文件中打印變量
    ansible# tree roles 
    roles
    +-- test
        +-- tasks
        ¦   +-- main.yml
        +-- vars
            +-- main
                +-- correct_vars.yml

    4 directories, 2 files

    ansible# cat roles/test/vars/main/correct_vars.yml  myname: bogd

    ansible# ansible-playbook -i inventory.yml test.yml 
    ... 
    ok: [localhost] => {
        "myname": "bogd" } 
    ...

    ansible# echo > roles/test/vars/main/emptyfile.yml

    ansible# ansible-playbook -i inventory.yml test.yml 
    ... ok: [localhost] => {
        "myname": "VARIABLE IS NOT DEFINED!" } 
    ...

稍后編輯:是的,這是一個錯誤......見這里

下面的例子

$ cat play.yml 
- hosts: localhost
  roles:
    - role1

$ cat roles/role1/tasks/main.yml 
- debug:
    var: var1

$ cat roles/role1/vars/main/var1.yml 
var1: test_var1

"var1": "test_var1"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM