我开始学习ansible,并尝试安装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文件的tasks部分)
- 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而不是数组。
我从3天开始学习ansible,我真的不明白怎么会有更多的循环。我在网上搜索,阅读文档,但我不明白
https://docs.ansible.com/ansible/2.4/playbooks_loops.html
如果有人能解释一下,我将非常感谢!
发布于 2019-01-20 20:38:35
好的,在我研究了很多之后,我找到了一个解决方案
- 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我把这个放在这里,也许有人会发现它有帮助。
发布于 2019-01-20 02:17:31
一种选择是使用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"https://stackoverflow.com/questions/54269947
复制相似问题