首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能的多维数组

问可能的多维数组
EN

Stack Overflow用户
提问于 2019-01-19 23:56:42
回答 2查看 3.6K关注 0票数 0

我开始学习ansible,并尝试安装PHP和php扩展。我有一个文件,我在其中声明了我的php版本和php扩展,它看起来像这样:

代码语言:javascript
复制
    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文件的tasks部分)

代码语言:javascript
复制
- 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

我得到以下输出:

代码语言:javascript
复制
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:

代码语言:javascript
复制
- 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而不是数组。

我从3天开始学习ansible,我真的不明白怎么会有更多的循环。我在网上搜索,阅读文档,但我不明白

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

如果有人能解释一下,我将非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2019-01-20 20:38:35

好的,在我研究了很多之后,我找到了一个解决方案

代码语言:javascript
复制
- name: Install PHP && Packages
  become: true
  package:
    pkg: php{{ item.0.version }}-{{ item.1 }}
    state: latest
  with_subelements:
    - "{{ php }}"
    - libs
  notify: Restart Nginx

这对我很有效。另外,我改变了我的数组:

代码语言:javascript
复制
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

我把这个放在这里,也许有人会发现它有帮助。

票数 1
EN

Stack Overflow用户

发布于 2019-01-20 02:17:31

一种选择是使用include_tasks。请参阅下面的提示。

代码语言:javascript
复制
tasks:
  - include_tasks: test.yml
    loop: "{{ php.versions }}"
    loop_control:
      loop_var: php_ver

。

代码语言:javascript
复制
> cat test.yml
- debug: msg="{{ lookup('dict', php_ver).key }}"
- debug: msg="{{ item }}"
  loop: "{{ lookup('dict', php_ver).value }}"

这是攻略

代码语言:javascript
复制
> 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

以下是输出

代码语言:javascript
复制
> 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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54269947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档