本文共 3287 字,大约阅读时间需要 10 分钟。
在Ansible的-playbook中,变量为管理动态值提供了便捷的方式。例如,若在多处反复使用nginx-1.6.3这样的软件包版本,可以将其设置为变量,在其他playbook中调用,便于维护且减少维护成本。
定义变量可通过以下方式进行:
命令行定义
使用-e选项在命令行指定变量值。在-playbook文件中定义
在任务模块下或在vars块中定义变量,例如:vars: packages: - tree
备注:模块下的变量仅适用于该模块的任务。
通过Inventory主机清单定义
在主机清单的组或整合组中定义变量,如[db_server:vars]web=httpd,只能在该组使用该变量。通过vars_file定义
在vars_file中定义变量,便于多个playbook共享。例如:vars_files: - ./vars.yml
通过host_vars和group_vars定义
创建host_vars和group_vars目录,分别在主机名称和主机组名称下存放变量文件。例如:mkdir host_vars group_vars
确保文件名与主机清单中的主机名或组名一致。
在不同定义方式中若变量冲突,其优先级顺序为:
1. 命令行定义 > 2. playbook文件定义 > 3. Inventory主机清单定义 > 4. vars_file定义 > 5. host_vars和group_vars定义变量命名规则:变量名以字母开头,允许字母、数字和下划线。
可以在任务模块下或在vars块中定义变量。
方式一:在模块下定义变量
tasks: - name: install tree server yum: name: "{packages}" vars: packages: - tree 方式二:在hosts下定义变量
hosts: nfs_groupvars: packages: - treetasks: - name: install tree server yum: name: "{packages}" vars: packages: - tree 注意事项:
在多个playbook中共享变量,例如:
vars_files: - ./vars.yml
变量文件示例:
web: httpddb: tree
通过vars_file调用的示例:
hosts: nfs_groupvars_files: - /root/vars.ymltasks: - name: Installed http Server yum: name: "{web}" 主机清单中定义变量优先级高于整合组。
配置主机清单:vim /etc/ansible/hosts[db_server]db01 ansible_ssh_pass='123'[db_server:vars]web=httpd
调用示例:
hosts: db_servertasks: - name: Touch File file: path: /tmp/{web} state: touch 注意事项:
在Ansible项目目录下创建host_vars和group_vars目录:
mkdir host_vars group_vars
主机组定义变量:
vim group_vars/web_grouppackages: []file: group_vars
主机定义变量:
vim host_vars/web01file: host_vars
调用示例:
hosts: web_groupvars_files: group_varstasks: - name: Touch File file: path: /tmp/{file} state: directory 通过-e选项在命令行指定变量:
ansible-playbook test.yml -e "file=minglinghang"
指定多个变量:
ansible-playbook test.yml -e "file=command" -e "file2=command2"
查看内置变量:
ansible 'web_group' -m setup
示例:创建时间备份目录:
- hosts: nfs_group tasks: - name: Touch File file: path: /backup/{ansible_fqdn}_{ansible_eth1.ipv4.address}_{ansible_date_time.date} state: directory 配置文件生成:
vim /etc/redis.confbind {ansible_eth1.ipv4.address} playbook示例:
hosts: web_grouptasks: - name: install redis server yum: name: redis - name: config redis template: src: /root/mm/redis.conf dest: /etc/
使用ad-hoc模式获取返回结果:
ansible web01 -m shell -a 'df -h' web01 | success | rc=0 >> output.log
注册变量示例:
- name: Touch File shell: "df -h" register: get_dir_list- name: Get Register debug: msg: "{get_dir_list}" 例如,检查PHP安装状态并自动安装:
- name: Tar php Package unarchive: src: /root/package/php.tar.gz dest: /tmp/- name: Check php Install Status shell: "rpm -qa | grep php | wc -l" register: get_php_instll_status- name: Install php Server shell: "yum localinstall -y /tmp/*.rpm" when: get_php_instll_status.stdout_lines == 0
获取主机信息并生成配置文件:
vim /etc/redis.confbind {ansible_eth1.ipv4.address} 关闭facts缓存(仅使用内置变量时关闭):
- hosts: web_group gather_facts: no tasks: - name: redis server install yum: name: redis state: present
广泛应用场景:
转载地址:http://hausz.baihongyu.com/