ANSIBLE многомерный массив - PullRequest
0 голосов
/ 19 января 2019

Я начинаю изучать ANSI и пытаюсь установить расширения PHP и PHP. У меня есть файл, в котором я объявляю свои версии php и расширения php, и он выглядит так:

    php:
  versions:
    - 7.2:
      - cli
      - fpm
      - curl
      - mysql
      - pdo
      - zip
      - xml
      - gd
      - mbstring
      - tokenizer
      - ctype
      - json
    - 7.3:
      - cli
      - fpm
      - curl
      - mysql
      - pdo
      - zip
      - xml
      - gd
      - mbstring
      - tokenizer
      - ctype
      - json

Я делаю это, потому что я хочу изучать ANSIBLE, а также для гибкости и установки различных расширений для каждой версии PHP.

Я пытаюсь отладить свой код с помощью этого (это находится в разделе задач в моем файле playbook.yml)

- name: DEBUG ANSIBLE PLAYBOOK
  debug:
    msg: The key is - {{ item.keys() | first }} The item is "{{ item[item.keys() | first] }}"
  loop: "{{ php.versions }}"
  loop_control:
    loop_var: item

Я получаю этот вывод:

TASK [DEBUG ANSIBLE PLAYBOOK] 
ok: [127.0.0.1] => (item={7.2: [u'cli', u'fpm', u'curl', u'mysql', u'pdo', u'zip', u'xml', u'gd', u'mbstring', u'tokenizer', u'ctype', u'json']}) => {
    "msg": "The key is - 7.2 The item is \"[u'cli', u'fpm', u'curl', u'mysql', u'pdo', u'zip', u'xml', u'gd', u'mbstring', u'tokenizer', u'ctype', u'json']\""
}
ok: [127.0.0.1] => (item={7.3: [u'cli', u'fpm', u'curl', u'mysql', u'pdo', u'zip', u'xml', u'gd', u'mbstring', u'tokenizer', u'ctype', u'json']}) => {
    "msg": "The key is - 7.3 The item is \"[u'cli', u'fpm', u'curl', u'mysql', u'pdo', u'zip', u'xml', u'gd', u'mbstring', u'tokenizer', u'ctype', u'json']\""
}

И я пытаюсь установить PHP, используя эту задачу:

- name: Install PHP
  package:
    pkg: php{{ item.keys() | first }}-{{ item[item.keys() | first] }}
    state: latest
  loop: "{{ php.versions }}"
  loop_control:
    loop_var: item
  notify: Restart Nginx

Но не работает, потому что item[item.keys() | first] - это массив, и я не знаю, как сделать цикл снова, чтобы получить cli, fpt вместо массива.

Я изучаю ANSIBLE с 3-х дней, и я действительно не понимаю, как можно зацикливаться больше раз. Я ищу в Интернете, читаю документацию, но не понимаю

https://docs.ansible.com/ansible/2.4/playbooks_loops.html

Если кто-то может объяснить, я буду очень признателен!

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Хорошо, после много исследований я нашел решение

- name: Install PHP && Packages
  become: true
  package:
    pkg: php{{ item.0.version }}-{{ item.1 }}
    state: latest
  with_subelements:
    - "{{ php }}"
    - libs
  notify: Restart Nginx

Эта работа для меня.Кроме того, я изменяю свой массив:

php:
  - version: 7.2
    libs:
      - cli
      - fpm
      - curl
      - mysql
      - pdo
      - zip
      - xml
      - gd
      - mbstring
      - tokenizer
      - ctype
      - json
  - version: 7.3
    libs:
      - cli
      - fpm
      - curl
      - mysql
      - pdo
      - zip
      - xml
      - gd
      - mbstring
      - tokenizer
      - ctype
      - json

Я позволил это здесь, возможно, кто-то найдет это полезным.

0 голосов
/ 19 января 2019

Можно было бы использовать include_tasks. Смотрите подсказку ниже.

tasks:
  - include_tasks: test.yml
    loop: "{{ php.versions }}"
    loop_control:
      loop_var: php_ver

.

> cat test.yml
- debug: msg="{{ lookup('dict', php_ver).key }}"
- debug: msg="{{ item }}"
  loop: "{{ lookup('dict', php_ver).value }}"

Вот эта пьеса

> cat test-31.yml
---
- hosts: localhost
  gather_facts: no
  vars:
    php:
      versions:
        - 7.2:
            - cli
            - fpm
            - curl
            - mysql
            - pdo
            - zip
            - xml
            - gd
            - mbstring
            - tokenizer
            - ctype
            - json
        - 7.3:
            - cli
            - fpm
            - curl
            - mysql
            - pdo
            - zip
            - xml
            - gd
            - mbstring
            - tokenizer
            - ctype
            - json
  tasks:
    - include_tasks: test.yml
      loop: "{{ php.versions }}"
      loop_control:
        loop_var: php_ver

Вот вывод

> ansible-playbook test-31.yml | grep msg
    "msg": "7.2"
    "msg": "cli"
    "msg": "fpm"
    "msg": "curl"
    "msg": "mysql"
    "msg": "pdo"
    "msg": "zip"
    "msg": "xml"
    "msg": "gd"
    "msg": "mbstring"
    "msg": "tokenizer"
    "msg": "ctype"
    "msg": "json"
    "msg": "7.3"
    "msg": "cli"
    "msg": "fpm"
    "msg": "curl"
    "msg": "mysql"
    "msg": "pdo"
    "msg": "zip"
    "msg": "xml"
    "msg": "gd"
    "msg": "mbstring"
    "msg": "tokenizer"
    "msg": "ctype"
    "msg": "json"
...