英文:
Ansible create a list from a loop inline
问题
我有一个操作手册,内容如下:
- name: 安装 PHP 扩展
ansible.builtin.apt:
pkg:
- php{{ php_version }}{{ item.pkg_extension }}
loop:
- { pkg_extension: -mysql }
- { pkg_extension: -bz2 }
- { pkg_extension: -curl }
- { pkg_extension: -gd }
- { pkg_extension: -imap }
- { pkg_extension: -mbstring }
- { pkg_extension: -xml }
- { pkg_extension: -zip }
when: php_key_setup is succeeded and nginx_install is succeeded and php_base_install is succeeded
register: php_install
有时出现我不明白的原因,这个循环中的某个包安装失败。我想将这些包作为列表或字典传递给 apt 模块,就像这样:
- name: 最佳 yum
ansible.builtin.yum:
name: "{{ list_of_packages }}"
state: present
如何从这个循环中创建这个列表,将所有内容连接起来,而不需要额外的步骤来创建这个列表并在之后重复使用它呢?
英文:
I have a playbook that goes like this:
- name: Install php extensions
ansible.builtin.apt:
pkg:
- php{{ php_version }}{{ item.pkg_extension }}
loop:
- { pkg_extension: -mysql }
- { pkg_extension: -bz2 }
- { pkg_extension: -curl }
- { pkg_extension: -gd }
- { pkg_extension: -imap }
- { pkg_extension: -mbstring }
- { pkg_extension: -xml }
- { pkg_extension: -zip }
when: php_key_setup is succeeded and nginx_install is succeeded and php_base_install is succeeded
register: php_install
Sometimes for reasons unknown to me, this fails for one of the packages in the loop. I want to pass these packages as a list or a dictionary to the apt module instead, like in
- name: Optimal yum
ansible.builtin.yum:
name: "{{ list_of_packages }}"
state: present
How can I create this list from this loop, concatenating everything without adding an extra step to create this list and reuse it afterwards?
答案1
得分: 3
如果您有一个扩展名列表,您可以使用map
来对每个项目应用regex_replace
过滤器,就像这样:
- hosts: localhost
gather_facts: false
vars:
php_version: 8.3
php_pkg_extensions:
- mysql
- bz2
- curl
- gd
- imap
- mbstring
- xml
- zip
tasks:
- name: 安装 PHP 扩展
ansible.builtin.apt:
pkg: "{{ packages }}"
vars:
packages: >-
{{
php_pkg_extensions |
map('regex_replace', '^(.*)$', 'php%s-\' % (php_version,))
}}
您不需要php_pkg_extensions
变量,但它会使事情更清晰。您可以改为这样编写:
- hosts: localhost
gather_facts: false
vars:
php_version: 8.3
tasks:
- name: 安装 PHP 扩展
ansible.builtin.apt:
pkg: "{{ packages }}"
vars:
packages: >-
{{
["mysql", "bz2", "curl", "gd", "imap", "mbstring", "xml", "zip"] |
map('regex_replace', '^(.*)$', 'php%s-\' % (php_version,))
}}
英文:
If you have the list of extensions in a list, you can use map
to apply the regex_replace
filter to each item, like this:
- hosts: localhost
gather_facts: false
vars:
php_version: 8.3
php_pkg_extensions:
- mysql
- bz2
- curl
- gd
- imap
- mbstring
- xml
- zip
tasks:
- name: Install php extensions
ansible.builtin.apt:
pkg: "{{ packages }}"
vars:
packages: >-
{{
php_pkg_extensions |
map('regex_replace', '^(.*)$', 'php%s-' % (php_version,))
}}
You don't need the php_pkg_extensions
variable, but it makes things much cleaner. You could instead write:
- hosts: localhost
gather_facts: false
vars:
php_version: 8.3
tasks:
- name: Install php extensions
ansible.builtin.apt:
pkg: "{{ packages }}"
vars:
packages: >-
{{
["mysql", "bz2", "curl", "gd", "imap", "mbstring", "xml", "zip"] |
map('regex_replace', '^(.*)$', 'php%s-' % (php_version,))
}}
答案2
得分: 2
给定以下变量
```yaml
php_version: 8.3
php_pkg_extensions:
- mysql
- bz2
- curl
- gd
- imap
- mbstring
- xml
- zip
声明列表
packages: "{{ ['php' ~ php_version]|
product(php_pkg_extensions)|
map('join', '-') }}"
将得到
packages:
- php8.3-mysql
- php8.3-bz2
- php8.3-curl
- php8.3-gd
- php8.3-imap
- php8.3-mbstring
- php8.3-xml
- php8.3-zip
<hr>
<sup>
用于测试的完整playbook示例
- hosts: localhost
vars:
php_version: 8.3
php_pkg_extensions:
- mysql
- bz2
- curl
- gd
- imap
- mbstring
- xml
- zip
packages: "{{ ['php' ~ php_version]|
product(php_pkg_extensions)|
map('join', '-') }}"
tasks:
- debug:
var: packages
- name: 安装php扩展
ansible.builtin.apt:
pkg: "{{ packages }}"
when: install_php_extensions|d(false)|bool
</sup>
<details>
<summary>英文:</summary>
Given the variables
```yaml
php_version: 8.3
php_pkg_extensions:
- mysql
- bz2
- curl
- gd
- imap
- mbstring
- xml
- zip
Declare the list
packages: "{{ ['php' ~ php_version]|
product(php_pkg_extensions)|
map('join', '-') }}"
gives what you want
packages:
- php8.3-mysql
- php8.3-bz2
- php8.3-curl
- php8.3-gd
- php8.3-imap
- php8.3-mbstring
- php8.3-xml
- php8.3-zip
<hr>
<sup>
Example of a complete playbook for testing
- hosts: localhost
vars:
php_version: 8.3
php_pkg_extensions:
- mysql
- bz2
- curl
- gd
- imap
- mbstring
- xml
- zip
packages: "{{ ['php' ~ php_version]|
product(php_pkg_extensions)|
map('join', '-') }}"
tasks:
- debug:
var: packages
- name: Install php extensions
ansible.builtin.apt:
pkg: "{{ packages }}"
when: install_php_extensions|d(false)|bool
</sup>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论