如何在Ansible中将Bash枚举输出注册为列表并使用
问题分析与解决方案
错误原因
- 注册变量引用错误:第一个任务
register: main_tables后,main_tables是包含stdout、stderr等字段的Ansible注册对象,直接在with_items中引用会遍历整个对象而非表名字符串。正确的表名内容存在于main_tables.stdout中,且是空格分隔的字符串,需要拆分后才能遍历。 - Shell命令引号嵌套问题:原命令中双引号嵌套SQL语句,容易引发解析错误导致意外EOF;同时直接在命令行暴露密码存在安全风险,语法也易出错。
- 冗余操作:原命令里的
echo $(...)属于多余操作,psql的-tAc参数已经会输出无冗余格式的结果,无需额外echo包裹。
修正后的Ansible任务
方法一:优化Shell模块实现
- name: Server - Get all tables names from the main database {{ DB_NAME }} shell: > PGPASSWORD={{ DB_POSTGRES_PASSWORD }} psql -U {{ POSTGRES_USER }} -h {{ POSTGRES_HOST }} -d {{ DB_NAME }} -tAc "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'" args: executable: /bin/bash become: true become_user: "{{ POSTGRES_USER }}" register: main_tables - name: Server - Display all data from the tables shell: > PGPASSWORD={{ DB_POSTGRES_PASSWORD }} psql -U {{ POSTGRES_USER }} -h {{ POSTGRES_HOST }} -d {{ DB_NAME }} -tAc "SELECT * FROM {{ item }}" args: executable: /bin/bash become: true become_user: "{{ POSTGRES_USER }}" with_items: "{{ main_tables.stdout.split() }}"
方法二:使用官方PostgreSQL模块(更安全规范)
推荐用postgresql_query模块,无需手动处理shell语法和密码暴露问题:
- name: Server - Get all tables names from the main database {{ DB_NAME }} postgresql_query: login_user: "{{ POSTGRES_USER }}" login_host: "{{ POSTGRES_HOST }}" login_password: "{{ DB_POSTGRES_PASSWORD }}" db: "{{ DB_NAME }}" query: "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'" register: main_tables - name: Server - Display all data from the tables postgresql_query: login_user: "{{ POSTGRES_USER }}" login_host: "{{ POSTGRES_HOST }}" login_password: "{{ DB_POSTGRES_PASSWORD }}" db: "{{ DB_NAME }}" query: "SELECT * FROM {{ item.table_name }}" loop: "{{ main_tables.query_result }}"
关键修正说明
- 变量引用修正:将
with_items: "{{ main_tables }}"改为with_items: "{{ main_tables.stdout.split() }}",把空格分隔的表名字符串拆分为可遍历的列表。 - 命令格式优化:用YAML折叠标量
>格式化shell命令,避免引号嵌套混乱,同时移除冗余的echo $(...)。 - 安全与规范提升:官方模块直接处理数据库交互,密码通过参数传递更安全,还能返回结构化查询结果,无需手动拆分字符串。
内容的提问来源于stack exchange,提问作者Michael Linker
相关产品推荐
相关产品推荐

