Как читать сложные включаемые переменные в Ansible - PullRequest
0 голосов
/ 03 марта 2020

У меня есть файл переменной, в котором есть несколько переменных "name" & "path", перечисленных под IP-адресом, как показано ниже.

10.0.0.12
    - name: exe_folder
      path: /tmp/exe
    - name: log_folder
      path: /tmp/log
    - name: src_folder
      path: /tmp/src

10.0.0.13
    - name: test_folder
      path: /tmp/exe1
    - name: out_folder
      path: /tmp/log1
    - name: com_folder
      path: /tmp/src1

 etc ....

Я могу l oop на имени и пути успешно в моем playbook, как показано ниже.

   - name: Load repository
     include_vars:
       file="{{ playbook_dir }}/vars/list.yml"
       name=user1

   - debug:
       msg: "{{ item.name + ':' + item.path }}"  
     loop: "{{ user1[inventory_hostname] }}"  

   - set_fact:
       allinonecmd: "{{ allinonecmd | default('') + 'ls -ltr ' + item.path + ' '}}"  
     loop: "{{ user1[inventory_hostname] }}"  

Мое требование - иметь новую переменную "mycode" под каждым IP-адресом, однако просто упомянуть об этом, и я должен быть в состоянии напечатать ее в l oop как выше playbook делает.

Таким образом мне нужно, чтобы мой переменный файл указывал mycode один раз для каждого IP. Я не уверен, какие изменения мне нужно внести в мой файл переменных и книгу воспроизведения, чтобы удовлетворить это требование.

10.0.0.12
    - name: exe_folder
      path: /tmp/exe
      mycode: "56.12"
    - name: log_folder
      path: /tmp/log
    - name: src_folder
      path: /tmp/src

10.0.0.13
    - name: test_folder
      path: /tmp/exe1
      mycode: "76.88"
    - name: out_folder
      path: /tmp/log1
    - name: com_folder
      path: /tmp/src1

 etc ....

Сбой в программе воспроизведения после того, как я внесу вышеуказанные изменения и попытаюсь напечатать переменную mycode.

   - debug:
       msg: "{{ item.name + ':' + item.path + item.mycode }}"  
     loop: "{{ user1[inventory_hostname] }}"  

Вывод ошибки:

fatal: [10.0.0.12]: FAILED! => {
    "msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'mycode'

Примечание: я не могу sh указывать mycode несколько раз под IP, так как это выглядит как грязное решение.

1 Ответ

1 голос
/ 03 марта 2020

Я думаю, что для этого варианта использования вы можете использовать фильтр default (), поэтому, если этот элемент отсутствует в списке, вы можете вызвать элемент по умолчанию или опустить его.

vars:
  my_default_value: "56.12"

   - debug:
       msg: "{{ item.name + ':' + item.path + (item.mycode | default(my_default_value) }}"       loop: "{{ user1[inventory_hostname] }}"  

Даже вы может составить комбинацию со значением по умолчанию (значение) и значением по умолчанию (опущено), чтобы соответствовать вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...