Проблема: доступ к переменной с именем, которое изменяется в цикле - PullRequest
0 голосов
/ 12 марта 2019

это содержимое моей пьесы:

- name: Download checksum
  get_url:
    url: "{{ item.value.url }}.sha1"
    dest: "/VAR/{{ ansible_user }}/tmp/{{ item.value.dest }}.sha1"
    mode: 0640
    timeout: 300
    force: yes
  with_dict: "{{ packages.list }}"

- name: slurp checksum
  slurp:
    src: "/VAR/{{ ansible_user }}/tmp/{{  item.value.dest }}.sha1"
  register:  {{  item.value.dest }}
  with_dict: "{{ packages.list }}"

- name: debug
  debug:
    msg: "sha1:{{ ['item']['value']['dest']['content'] | b64decode }}"
  with_dict: "{{ packages.list }}"

в моих переменных:

packages:
  list:
    package_name1:
      url: http://domaine.com/package_name_src1
      dest: package_name_dest1
    package_name2:
      url: http://domaine.com/package_name_src2
      dest: package_name_dest2
      .....
      .....
      and so on

Я пытаюсь загрузить контрольную сумму, которая находится в http://package_url.sha1 и поместите его в переменную, затем напечатайте его с помощью debug (msg).конечная цель - использовать переменную checkome в get_url для проверки контрольной суммы после загрузки.и главная проблема, если я хочу упростить вещи, это то, что я должен достичь чего-то подобногоя получаю каждый раз следующую ошибку:

    fatal: [server]: FAILED! => {
    "msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'value'\n\nThe error appears to have been in 'test.yml': line 54, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: debug\n      ^ here\n"
}

1 Ответ

0 голосов
/ 13 марта 2019

Я бы тоже попытался упростить вещи, и вот некоторые изменения, которые я предлагаю:

  1. в задаче slurp, зарегистрируйте одну переменную, скажем slurp_var. Ansible в каждом цикле не будет перезаписывать вашу переменную, каждый цикл будет добавлять результаты в массив списка slurp_var.results (пример следует).
  2. чтобы напечатать или обработать ваши результаты, используйте цикл with_items.

вот модифицированный PB для демонстрации результата:

---
- hosts: localhost
  gather_facts: false
  vars:
    packages:
      list:
        package_name1:
          url: http://domaine.com/package_name_src1
          dest: file1
        package_name2:
          url: http://domaine.com/package_name_src2
          dest: file2


  tasks:
    - name: slurp checksum
      slurp:
        src: "/tmp/{{ item.value.dest }}.sha1"
      register:  slurp_var
      with_dict: "{{ packages.list }}"

    - name: debug
      debug:
        msg: "sha1: {{ item.content | b64decode }}"
      with_items: "{{ slurp_var.results }}"

демонстрационный прогон:

[http_offline@greenhat-29 tests]$ cat /tmp/file1.sha1        
c1b016a6506775492a1968a1fa703781c6d066c8
[http_offline@greenhat-29 tests]$ cat /tmp/file2.sha1        
6ab7a14cf0e04c09f1a2f0f572e7d67e35fa37bd
[http_offline@greenhat-29 tests]$ ansible-playbook test.yml  

PLAY [localhost] *******************************************************************************************************************************************************************************************************

TASK [slurp checksum] **************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'key': 'package_name1', 'value': {'url': 'http://domaine.com/package_name_src1', 'dest': 'file1'}})
ok: [localhost] => (item={'key': 'package_name2', 'value': {'url': 'http://domaine.com/package_name_src2', 'dest': 'file2'}})

TASK [debug] ***********************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'content': 'YzFiMDE2YTY1MDY3NzU0OTJhMTk2OGExZmE3MDM3ODFjNmQwNjZjOAo=', 'source': '/tmp/file1.sha1', 'encoding': 'base64', 'invocation': {'module_args': {'src': '/tmp/file1.sha1'}}, '_ansible_parsed': True, '_ansible_no_log': False, 'failed': False, 'changed': False, 'item': {'key': 'package_name1', 'value': {'url': 'http://domaine.com/package_name_src1', 'dest': 'file1'}}, '_ansible_item_result': True, '_ansible_ignore_errors': None, '_ansible_item_label': {'key': 'package_name1', 'value': {'url': 'http://domaine.com/package_name_src1', 'dest': 'file1'}}}) => {
    "msg": "sha1: c1b016a6506775492a1968a1fa703781c6d066c8\n"
}
ok: [localhost] => (item={'content': 'NmFiN2ExNGNmMGUwNGMwOWYxYTJmMGY1NzJlN2Q2N2UzNWZhMzdiZAo=', 'source': '/tmp/file2.sha1', 'encoding': 'base64', 'invocation': {'module_args': {'src': '/tmp/file2.sha1'}}, '_ansible_parsed': True, '_ansible_no_log': False, 'failed': False, 'changed': False, 'item': {'key': 'package_name2', 'value': {'url': 'http://domaine.com/package_name_src2', 'dest': 'file2'}}, '_ansible_item_result': True, '_ansible_ignore_errors': None, '_ansible_item_label': {'key': 'package_name2', 'value': {'url': 'http://domaine.com/package_name_src2', 'dest': 'file2'}}}) => {
    "msg": "sha1: 6ab7a14cf0e04c09f1a2f0f572e7d67e35fa37bd\n"
}

PLAY RECAP *************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0   

[http_offline@greenhat-29 tests]$ 

Одной вещью, которая требует вашего внимания, является проверка slurp_var, когда отсутствует файл, который вы пытаетесь «прихлебать», а затем добавьте несколько предложений when в ваших последующих задачах.

надеюсь, это поможет!

...