ansible variables
变量介绍
ansible中变量可以提供便捷的方式来管理动态值,如果需要反复用到一些值,且后续可能进行修改,我们就可以定义变量。
变量定义方式介绍
变量定义方式有三种
通过命令行传递变量参数(一般临时测试时候使用)
在playbook中定义变量
通过vars定义变量
通过vars_files定义变量
通过inventory文件对主机组或单个主机定义变量
通过host_vars对主机进行定义
通过group_vars对主机组进行定义(有一个特殊的组all包含全员)
这几种方式定义变量的优先级
命令行传参 > playbook中vars_files方式传参 > playbook中vars方式传参 > inventoy主机变量 > host_vars > group_vars > group_vars(all组情况下) > inventory组变量
在playbook中定义变量
vars方式定义
在playbook文件中开头通过vars关键字定义
[root@k81 an]# cat > v1.yaml<<EOF - hosts: localhost vars: - web_pkg: nginx - ftp_pkg: vsftpd tasks: - name: Test output vars debug: msg: ["{{ web_pkg }}", "{{ ftp_pkg }}"] EOF ## 开始测试 [root@k81 an]# ansible-playbook v1.yaml TASK [Test output vars] ******************************************************************************************************************************************************************* ok: [localhost] => { "msg": [ "nginx", "vsftpd" ] } PLAY RECAP *******************************************************************************************************************************************************************************
vars_files方式定义
定义一个单独的变量文件
[root@k81 an]# cat > vars_file.yaml <<EOF --- nfs: nfs-server1 smb: smb-server1 EOF ## 写一个playbook调用 [root@k81 an]# cat > v2.yaml <<EOF --- - hosts: localhost vars_files: - ./vars_file.yaml # 声明变量文件路径 tasks: - name: Test output vars debug: msg: - "{{ nfs }}" - "{{ smb }}" EOF ## 测试 [root@k81 an]# ansible-playbook v2.yaml TASK [Test output vars] ******************************************************************************************************************************************************************* ok: [localhost] => { "msg": [ "nfs-server1", "smb-server1" ] } PLAY RECAP ******************************************************************************************************************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ## 可以看到结果如预期所料
通过inventory文件定义变量
设置主机变量和组变量
[root@k81 an]# cat > hosts <<EOF # 记得需要配置ansible.cfg指定inventory文件为该hosts文件 [centos] c1 id=1 role=master c2 id=2 role=slave c3 id=3 role=lb [centos:vars] port=6535 EOF [root@k81 an]# cat > v3.yaml <<EOF --- - hosts: centos tasks: - name: Test vars debug: msg: "{{ id }}-{{ role }}:{{ port }}" EOF ## 测试 [root@k81 an]# ansible-playbook v3.yaml TASK [Test vars] ************************************************************************************************************************************************************************** ok: [c1] => { "msg": "1-master:6535" } ok: [c2] => { "msg": "2-slave:6535" } ok: [c3] => { "msg": "3-lb:6535" } PLAY RECAP ******************************************************************************************************************************************************************************** c1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 c2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 c3 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使用host_vars方式定义变量
[root@k81 an]# cat >hosts <<EOF [centos] c1 c2 EOF ##定义变量 [root@k81 an]# mkdir host_var # 文件夹名字不能错,必须叫这个 [root@k81 an]# cat > host_var/c1 <<EOF # 这里文件名字需要对应资产中主机名字 state: MASTER priority: 200 EOF [root@k81 an]# cat > host_var/c2 <<EOF # 这里文件名字需要对应资产中主机名字 state: SLAVE priority: 100 EOF [root@k81 an]# cat > v4.yaml <<EOF --- - hosts: centos tasks: - name: Test vars debug: msg: "{{ state }}-{{ priority }}" EOF ## 测试 [root@k81 an]# ansible-playbook v4.yaml TASK [Test vars] ************************************************************************************************************************************************************************** ok: [c1] => { "msg": "MASTER-200" } ok: [c2] => { "msg": "SLAVE-100" } PLAY RECAP ***************************************************************************************************************************************************************************
使用guoup_vars方式定义变量
[root@k81 an]# mkdir group_vars # 文件夹名字不能错,必须叫这个 [root@k81 an]# cat > guoup_vars/centos <<EOF # 这里对应的是资产中的组名,如果设置为all的话那就是所有组共用 servers: WEB port: 80 EOF [root@k81 an]# cat > hosts <<EOF [centos] c1 c2 EOF [root@k81 an]# cat > v5.yaml <<EOF --- - hosts: centos tasks: - name: Test vars debug: msg: "{{ servers }}:{{ port }}" EOF ## 测试 [root@k81 an]# ansible-playbook v5.yaml TASK [Test vars] **************************************************************************************************************************************************** ok: [c1] => { "msg": "WEB:80" } ok: [c2] => { "msg": "WEB:80" } PLAY RECAP ********************************************************************************************************************************************************** c1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 c2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
通过命令参数传递变量
命令执行的时候使用 -e 参数传变量
# 使用上面的v5.yaml测试 [root@k81 an]# ansible-playbook v5.yaml -e "servers=DB port=3306" # 变量名一定要和playbook中的一致 TASK [Test vars] *************************************************************************************************************************************************** ok: [c1] => { "msg": "DB:3306" } ok: [c2] => { "msg": "DB:3306" } PLAY RECAP ********************************************************************************************************************************************************* c1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 c2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0