如何编写DRY风格Ansible Playbook?优化PostgreSQL用户创建任务
优化Ansible PostgreSQL用户创建任务的变量提取方案
针对你需要批量创建PostgreSQL用户、避免重复编写连接参数的需求,这里有几个实用的优化方案:
方法1:定义通用连接变量+字典合并
直接在Playbook里把重复的连接参数封装成一个字典变量,然后用Ansible的字典合并语法(<<:)复用,只需要在每个任务中指定唯一的用户名:
- hosts: localhost vars: pg_common_params: login_host: the.db.com login_password: password port: 5432 login_user: admin db: the-db tasks: - postgresql_user: <<: "{{ pg_common_params }}" name: user-i-want-to-create-1 - postgresql_user: <<: "{{ pg_common_params }}" name: user-i-want-to-create-2 # 继续添加更多用户创建任务...
方法2:结合循环批量创建用户
如果要创建的用户数量很多,用循环(loop)可以进一步简化,只需要维护一个用户名列表:
- hosts: localhost vars: pg_common_params: login_host: the.db.com login_password: password port: 5432 login_user: admin db: the-db target_pg_users: - user-i-want-to-create-1 - user-i-want-to-create-2 - user-i-want-to-create-3 # 在这里添加所有需要创建的用户名 tasks: - postgresql_user: <<: "{{ pg_common_params }}" name: "{{ item }}" loop: "{{ target_pg_users }}"
方法3:独立变量文件(进阶复用)
如果需要在多个Playbook中复用这些连接参数,或者项目规模较大,可以把变量放到单独的YAML文件中,比如group_vars/all/pg_config.yml:
# group_vars/all/pg_config.yml pg_common_params: login_host: the.db.com login_password: password port: 5432 login_user: admin db: the-db
之后在Playbook中直接引用(默认路径下甚至不需要手动加载):
- hosts: localhost vars: target_pg_users: - user-i-want-to-create-1 - user-i-want-to-create-2 tasks: - postgresql_user: <<: "{{ pg_common_params }}" name: "{{ item }}" loop: "{{ target_pg_users }}"
额外提醒
生产环境中不要明文存储密码,建议用Ansible Vault加密敏感变量:
ansible-vault encrypt group_vars/all/pg_config.yml
运行Playbook时加上--ask-vault-pass参数即可解密使用。
内容的提问来源于stack exchange,提问作者alecbz
相关产品推荐
相关产品推荐

