如何根据多数据库启动变量加载Ansible字典中的变量?
处理Ansible中指定多个数据库执行任务的方案
问题背景
在group_vars中定义了存储数据库配置的字典connections:
connections: db1: bucketfsurl: 'https://1.2.3.121:2581/bucket2/virtual-schema.jar' instance: '001' profile_name: 'user@db1' role: 'primary' db2: bucketfsurl: 'https://1.2.3.21:2581/virtualschema/virtual-schema.jar' instance: '002' profile_name: 'user@db2' role: 'primary' db3: bucketfsurl: 'https://1.2.3.21:2581/bucket2/virtual-schema.jar' instance: '003' profile_name: 'user@db3' role: 'primary' db4: bucketfsurl: 'https://1.2.3.131:2581/bucket2/virtual-schema.jar' instance: '004' profile_name: 'user@db4' role: 'primary'
角色任务tasks/main.yml中现有任务仅支持单个database参数匹配:
- name: Load S3 driver to BucketFS ansible.builtin.shell: /usr/bin/curl -k -X PUT -T {{ item.value.bucketfsurl }} -v loop: "{{ connections | dict2items }}" when: 'database == item.key' loop_control: label: "{{ item.key }}"
执行命令示例(单个数据库):
ansible-playbook /home/david/playbook.yml -i /home/david/inventory/testhosts -e database=db1
需要修改为支持指定多个数据库的场景。
解决方案
方法1:通过逗号分隔传入多个数据库,动态转换为列表
修改任务逻辑,兼容单个值和逗号分隔的多值输入:
- 添加变量转换逻辑:在角色的
vars/main.yml或Playbook开头加入:
# 将传入的database转换为列表,兼容单个值和逗号分隔的多值 databases: "{{ database.split(',') if database is string else database }}"
- 更新任务匹配条件:
- name: Load S3 driver to BucketFS ansible.builtin.shell: /usr/bin/curl -k -X PUT -T {{ item.value.bucketfsurl }} -v loop: "{{ connections | dict2items }}" when: item.key in databases loop_control: label: "{{ item.key }}"
- 执行命令(传入多个数据库):
ansible-playbook /home/david/playbook.yml -i /home/david/inventory/testhosts -e database=db1,db2,db3
方法2:直接传入列表格式变量,优化循环效率
如果希望只循环指定数据库(减少不必要的遍历),可以直接传入列表变量:
- 执行命令时传入列表:
ansible-playbook /home/david/playbook.yml -i /home/david/inventory/testhosts -e "databases=['db1','db2']"
- 重构任务循环逻辑:
- name: Load S3 driver to BucketFS ansible.builtin.shell: /usr/bin/curl -k -X PUT -T {{ connections[item].bucketfsurl }} -v loop: "{{ databases }}" loop_control: label: "{{ item }}" # 可选:校验传入的数据库是否存在,避免无效键报错 when: item in connections.keys()
这种方式直接遍历指定的数据库列表,跳过不存在的键,执行效率更高。
内容的提问来源于stack exchange,提问作者gurbelunder
相关产品推荐
相关产品推荐

