Ansible如何将公共变量存放于Playbook外部?
没问题!要实现把公共变量移到Playbook外部,同时兼顾安全和减少重复代码,Ansible有一套很成熟的方案,我一步步给你讲:
1. 创建全局变量文件集中管理
首先,我们可以用Ansible的组变量文件来存放全局公共变量,这种方式会自动被所有Playbook加载,不用手动引入。
创建group_vars/all.yml文件(如果group_vars目录不存在就先创建),把你的公共变量放进去,敏感信息比如密码要用Ansible Vault加密:
# group_vars/all.yml storage_host: "<你的IP地址>" storage_port: "<你的端口号>" storage_user: "admin" # 下面是加密后的密码,用Ansible Vault生成 storage_password: !vault | $ANSIBLE_VAULT;1.1;AES256 36323939643438363837353061373034386438363337613233353830613736383637336634363334 3363353962373038343639373732313537353638323533360a373430363530323735323738383634 38383939353135303239383539383333363637393737383437323635313630303037313537323039 3335383630363433340a323331383336303537363739353330313239343939373832313838363733 35633539303138393530333730323431373164313538353130373230373430383336
2. 加密敏感变量(关键!)
密码这类敏感信息绝对不能明文存储,用Ansible Vault加密非常简单:
在终端执行以下命令,输入你的密码后,会生成加密后的字符串,直接复制到上面的变量文件里即可:
ansible-vault encrypt_string '你的真实密码' --name 'storage_password'
3. 修改Playbook引用变量
把原来Playbook里硬编码的参数换成变量引用,同时调整成更规范的YAML格式(避免用host=<ip>这种旧格式):
- hosts: localhost tasks: - name: Get all Storage Service Levels StorageServiceLevelModule: host: "{{ storage_host }}" port: "{{ storage_port }}" user: "{{ storage_user }}" password: "{{ storage_password }}" action: get name: 'my_ssl' register: jsonResultforSSLs - name: print the SSL key debug: msg: "{{ jsonResultforSSLs.meta.result.records[0].key}}" - name: Get all Storage VMs StorageVMModule: host: "{{ storage_host }}" port: "{{ storage_port }}" user: "{{ storage_user }}" password: "{{ storage_password }}" action: get name: my_svm register: jsonResultforSVMs
4. 运行Playbook时提供Vault密码
因为变量文件里有加密内容,运行Playbook时需要验证密码,有两种常用方式:
- 交互式输入密码:
ansible-playbook your_playbook.yml --ask-vault-pass
- 用密码文件(更适合自动化场景,注意把密码文件权限设为
600,防止其他人读取):
ansible-playbook your_playbook.yml --vault-password-file vault_pass.txt
额外优化:进一步减少重复代码
如果多个模块都用到相同的公共参数,还可以用module_defaults来统一设置模块默认参数,让代码更简洁:
- hosts: localhost # 给你的存储模块设置默认参数 module_defaults: StorageServiceLevelModule: host: "{{ storage_host }}" port: "{{ storage_port }}" user: "{{ storage_user }}" password: "{{ storage_password }}" StorageVMModule: host: "{{ storage_host }}" port: "{{ storage_port }}" user: "{{ storage_user }}" password: "{{ storage_password }}" tasks: - name: Get all Storage Service Levels StorageServiceLevelModule: action: get name: 'my_ssl' register: jsonResultforSSLs - name: print the SSL key debug: msg: "{{ jsonResultforSSLs.meta.result.records[0].key}}" - name: Get all Storage VMs StorageVMModule: action: get name: my_svm register: jsonResultforSVMs
这样一来,你的敏感信息安全得到保障,全局变量集中管理,代码重复率也大大降低啦!
内容的提问来源于stack exchange,提问作者master_hemant
相关产品推荐
相关产品推荐

