第 6 章 Playbook变量定义与使用
第 6 章 Playbook变量定义与使用
变量可以通过以下6种方法进行定义:
1.命令行
2.在Inventory中定义
3.在Playbook中定义
4.在Roles中定义
5.注册变量(register)
6.系统信息变量(facts)
1.命令行 引入变量
创建一个playbook脚本
#var.yml
---
- hosts: abc
  gather_facts: no
  remote_user: root
  tasks:
  - name: test var
    debug:
      msg: "{{ work_dir }}"
通过命令传入变量参数:传入变量使用-e参数:
[root@CentOS7 test]# ansible-playbook var.yml -e work_dir=/usr/local
PLAY [abc] ************************************************************************************************************
TASK [test var] *******************************************************************************************************
ok: [142.4.123.13] => {
    "msg": "/usr/local"
}
ok: [47.241.90.203] => {
    "msg": "/usr/local"
}
2.在Inventory中定义
在之前主机清单那节中演示过添加变量,已下仅作为回顾
主机清单变量引用
单个主机变量引用 http_port=80
例如:
[web]
192.168.0.13 ansible_ssh_user=root ansible_ssh_pass=123.com http_port=80
192.168.0.14 ansible_ssh_user=root ansible_ssh_pass=123.com
输出变量:
[root@ansible~]# ansible 192.168.0.13 -a "echo {{http_port}}"
整个主机组变量引用(在主机组web的基础上定义)
方法一:在主机清单中直接定义:
[web:vars]
http port= 8080
server_name=www.ctnrs.com
输出变量:
[root@ansible~]# ansible web -a "echo {{http_port}}"
192.168.0.13 | SUCCESS | rc=0 >> 8080 192.168.0.14 | SUCCESS | rc=0>> 8080
[root a ansible~] # ansible web -a "echo{{server_name}}"
192.168.0.13 | SUCCESS | rc=0 >> www.ctnrs.com 192.168.0.14 | SUCCESS | rc=0>> www.ctnrs.com
方法二:在ansible下创建目录group_vars:
mkdir /etc/ansible/group_vars
vim /etc/ansible/group_vars/web.yml (文件名需要跟组名相同)
http_port: 8080
server_name: www.longtao.vip
注意:冒号后有空格再跟参数。
3.在Playbook中定义
示例:
---
- hosts: abc
  gather_facts: no
  remote_user: root
  vars:
    - work_dir: /usr/local
    - nginx_version: 1.15
  tasks:
  - name: test var
    debug:
      msg: "{{ work_dir }}/nginx{{nginx_version}}"
效果:
[root@CentOS7 test]# ansible-playbook var.yml
PLAY [abc] ************************************************************************************************************
TASK [test var] *******************************************************************************************************
ok: [142.4.123.13] => {
    "msg": "/usr/local/nginx1.15"
}
ok: [47.241.90.203] => {
    "msg": "/usr/local/nginx1.15"
}
4.在Roles中定义
后面再讲roles使用时会单独 讲
5.注册变量(register)
将某一个执行某个任务的结果保存到变量中,这样能够动态获取一个变量。
示例:获取时间并生成目录
---
- hosts: abc
  gather_facts: no
  remote_user: root
  tasks:
  - name: register var
    command: date +"%F_%T"
    register: datetime
  - name: create dir
    file:
      dest: "/tmp/{{datetime.stdout}}"
      state: directory
需注意你定义的注册变量内会有很多值,这里使用datetime.stdout只是其中一个值,
使用debug: msg={{datetime}} 可以输出全部值如下:
ok: [142.4.123.13] => {
    "msg": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": true,
        "cmd": [
            "date",
            "+%F_%T"
        ],
        "delta": "0:00:00.003659",
        "end": "2021-08-18 23:16:26.303546",
        "failed": false,
        "rc": 0,
        "start": "2021-08-18 23:16:26.299887",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "2021-08-18_23:16:26",
        "stdout_lines": [
            "2021-08-18_23:16:26"
        ]
    }
}
6.系统信息变量(facts)
注意如果playbook脚本中需要定义gather_facts启用
gather_facts: yes
系统提供了哪些系统信息变量通过setup模块查看:
ansible -i /etc/ansible/hosts web -m setup
提供一个简单示例:
---
- hosts: web
  gather_facts: yes
  remote_user: root
  
  tasks:
  - name: get hostname
    debug: msg="主机名:{{ansible_nodename}}"
  - name: get ipv4
    debug: msg="IPv4:{{ansible_all_ipv4_addresses}}"
  - name: get ipv6
    debug: msg="IPv6:{{ansible_all_ipv6_addresses}}"
  - name: get mem
    debug: msg="内存:{{ansible_memory_mb.real}}"
  - name: get dns
    debug: msg="DNS:{{ansible_dns.nameservers}}"
                