Ansible не передавал переменные между файлами - PullRequest
0 голосов
/ 06 февраля 2019

Я пытался использовать Ansible, чтобы поместить некоторые шаблоны jinja2 в каталог, например, path/from/*.j2 to path/to/*.txt.

В моем ./defaults/main.yml:

---

test_var:
  - a: 1
    b: 2
  - a: 10
    b: 20

В моем ./tasks/main.yml:

---

- name: "Copy file"
  include: copy-files.yml
  with_nested:
    - test_var
  loop_control:
    loop_var: test_loop

В моем ./tasks/copy-files.yml:

---

- name: "copy {{ test_loop }}"
  template:
    src: "{{ test_loop.0.a }}"
    dest: "{{ test_loop.0.b }}"

я получил следующую ошибку:

fatal: [localhost]: FAILED! => {"failed": true, "msg": "'unicode object' has no attribute 'b'"}

Затем я использовал отладку и увидел, что переменные пропали.

task path: ./tasks/main.yml
Wednesday 06 February 2019  01:15:10 +0000 (0:00:00.286)       0:00:04.308 ****
ok: [localhost] => {
    "msg": [
        {
            "a": 1,
            "b": 2
        },
        {
            "a": 10,
            "b": 20
        }
    ]
}

TASK [./ : Copy files] ********
task path: ./tasks/main.yml
Wednesday 06 February 2019  01:15:11 +0000 (0:00:00.064)       0:00:04.373 ****

TASK [./ : debug] *******************************
task path: ./tasks/copy-files.yml
Wednesday 06 February 2019  01:15:11 +0000 (0:00:00.089)       0:00:04.463 ****
ok: [localhost] => {
    "msg": [
        "a",
        "b"
    ]
}

Так что тут не так?ansible 2.1.0.0

1 Ответ

0 голосов
/ 06 февраля 2019

Так что здесь может быть не так?

В игре есть несколько вещей.

Прежде всего, вам не хватает замены jinja вашего with_nested:;Я не имею ни малейшего представления, почему вы даже получили «а» и «б», поскольку это очень ясно, что list из str вы кормили до with_nested:.Я полагаю, что вы хотели with_nested: "{{ test_var }}".Возможно, ansible «помог» вам, потому что невероятно, тревожно древняя версия ansible, на которой вы работаете, но современная версия не автоматически вводит это имя в переменную, так что имейте это в виду.

Однако даже исправление, которое не решит вашу проблему, поскольку with_nested: хочет list из list, а не list из dict;как вы можете видеть из тонкого руководства , оно фактически вызывает {{ with_nested[0] | product(with_nested[1]) }} и продукт из dict является list из tuple его .keys(),который объясняет "a" и "b", которые вы видите

Если вы хотите, чтобы src и dest были значениями клавиш a и b соответственно, тогда пропустите притворствои построить with_nested: таким образом:

with_nested:
- '{{ test_var | map(attribute="a") | list }}'
- '{{ test_var | map(attribute="b") | list }}'
...