
1. Ansible 变量的定义和使用
变量是 Ansible 实现动态配置的核心,通过变量可以在 Playbook 中灵活调整任务内容。
1.1 变量的定义
在 Playbook 中定义变量
可以在 vars 字段中定义变量:
- name: 定义变量 hosts: all vars: app_name: "MyApp" app_port: 8080
在主机变量文件中定义变量
在hosts文件中为特定主机定义变量:
[webservers]web1 ansible_user=ubuntu app_env=productionweb2 ansible_user=root app_env=staging
在组变量文件中定义变量
组变量文件路径为 group_vars/.yml:
# group_vars/webservers.ymlapp_name: "MyWebApp"app_port: 80
在主机变量文件中定义变量
主机变量文件路径为 host_vars/.yml:
# host_vars/web1.ymlapp_env: production
1.2 使用变量
在 Playbook 中通过 {{ variable_name }} 的形式引用变量:
- name: Start application service: name: "{{ app_name }}" state: started
也可以直接在临时命令直接调用
ansible all -m debug -a "msg='The value of my_var is {{ app_name }}'"
2. 变量优先级
当同一个变量在多个地方定义时,Ansible 根据优先级覆盖变量值。优先级从高到低如下:
1、命令行变量(--extra-vars)。 2、主机变量文件(host_vars/.yml)。 3、组变量文件(group_vars/.yml)。 4、Playbook 中定义的变量(vars)。 5、默认变量(模块或角色的默认值)。
举个列子:
ansible-playbook deploy.yml --extra-vars "app_port=9090"
此时,app_port 的值为 9090,会覆盖 Playbook 中的任何定义。
3. 模板文件(template 模块)
模板文件是基于 Jinja2 的动态内容生成工具,可以结合变量实现配置文件的自动化生成。
3.1 使用 template 模块
使用模板生成远程配置文件:
- name: Deploy configuration using template template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf
模板文件 nginx.conf.j2 示例:
server { listen {{ app_port }}; server_name {{ app_name }}; location / { proxy_pass http://127.0.0.1:5000; }}
3.2 条件渲染
在模板中使用条件语句动态控制内容:
{% if app_env == "production" %}server { listen 80;}{% else %}server { listen 8080;}{% endif %}
3.3 循环处理
在模板中使用循环生成重复内容:
upstream backend { {% for host in backend_hosts %} server {{ host }}:5000; {% endfor %}}
4. 变量的加密保护:Ansible Vault
Ansible Vault 用于保护敏感信息,如密码和密钥。
4.1 创建加密文件
使用 ansible-vault create 创建加密文件:
ansible-vault create secrets.yml
文件内容示例:
db_password: "securepassword"api_key: "1234567890abcdef"
4.2 使用加密文件
在 Playbook 中引用加密变量:
- name: Use encrypted variables hosts: all vars_files: - secrets.yml tasks: - name: Print the database password debug: msg: "The database password is {{ db_password }}"
4.3 解密文件
使用 ansible-vault decrypt 解密文件:
ansible-vault decrypt secrets.yml
4.4 修改加密文件
使用 ansible-vault edit 修改文件内容:
ansible-vault edit secrets.yml
4.5 通过命令行传递密码
使用 --ask-vault-pass 提供密码:
ansible-playbook playbook.yml --ask-vault-pass
5. 变量与模板结合使用
目标:使用模板动态生成 Nginx 配置文件,并部署到目标主机。
模板文件 nginx.conf.j2:
server { listen {{ app_port }}; server_name {{ app_name }}; location / { proxy_pass http://127.0.0.1:5000; }}
Playbook 示例:
- name: Deploy Nginx configuration hosts: webservers vars: app_name: "MyWebApp" app_port: 8080 tasks: - name: Deploy Nginx configuration file template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf owner: root group: root mode: '0644' - name: Restart Nginx service: name: nginx state: restarted
执行 Playbook:
ansible-playbook deploy_nginx.yml
本文结束,下一篇将介绍一下角色roles
如有帮助,请点个赞和“在看”!如有不足,敬请指出!感谢你的关注与支持。 路虽远,行则将至! 事虽难,做则必成!共勉!
红帽认证RHCE题目及答案分享(上),全面了解Ansible的生产实践 红帽认证RHCE题目及答案分享(下),全面了解Ansible的生产实践
Ansible 入门教程:从零开始掌握自动化运维 Linux的150个常用命令汇总,运维大神不一定全部掌握! Linux文件处理三剑客详解(运维高手必备) Nginx配置文件详解及常用功能配置(实用率90%)