一、facts:可直接调用

ansible_all_ipv4_addresses             #所有机器的ipv4地址
ansible_all_ipv6_addresses             #所有机器的ipv6地址#系统时间
ansible_ens33['ipv4']['address']      #仅显示ipv4的信息 ---> ens33 的ip地址
ansible_date_time                          #系统时间     年月日:ansible_date_time.date  分时秒:ansible_date_time.time                   
ansible_kernel                                #内核版本
ansible_default_ipv4                      #默认ipv4地址 
ansible_default_ipv6                      #默认ipv6地址
ansible_hostname                          #主机名
ansible_pkg_mgr                            #包管理器
ansible_devices                              #仅显示磁盘设备信息
ansible_distribution                       #显示是什么系统,例:centos,suse等
ansible_distribution_version          #仅显示系统版本
ansible_machine                            #显示系统类型,例:32位,还是64位
ansible_eth0                                  #仅显示eth0的信息
ansible_fqdn                                  #完全域名解析
ansible_kernel                               #仅显示内核版本
ansible_lvm                                   # 显示lvm相关信息
ansible_memtotal_mb                  #显示系统总内存
ansible_memfree_mb                   #显示可用系统内存
ansible_memory_mb                    #详细显示内存情况
ansible_swaptotal_mb                  #显示总的swap内存
ansible_swapfree_mb                   #显示swap内存的可用内存
ansible_mounts                            #显示系统磁盘挂载情况
ansible_processor                         #显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus              #显示cpu个数(只显示总的个数)
ansible_python_version                #显示python版本cd /tmp

举例:

# touch /tmp/hosts

# vim /tmp/vars.yaml
---
 - hosts: web1
   vars:
   - IP: "{{ ansible_ens33['ipv4']['address'] }}"
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP }}  {{ ansible_hostname }}"


执行
# ansible-playbook vars.yaml

二、在剧本里直接定义vars

# vim vars.yaml
---
 - hosts: web1
   vars:
   - IP1: "{{ ansible_ens33['ipv4']['address'] }}"
   - IP2: "192.168.58.11"
   - host_name: a2
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP1 }}  {{ ansible_hostname }}"
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP2 }}  {{ host_name }}"

执行
# ansible-playbook vars.yaml


使用与facts组件关键字一样的变量名字:

# vim vars.yaml
---
 - hosts: web1
   vars:
   - IP1: "{{ ansible_ens33['ipv4']['address'] }}"
   - IP2: "192.168.58.11"
   - host_name: a2
   - ansible_hostname: A2
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP1 }}  {{ ansible_hostname }}"
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP2 }}  {{ host_name }}"


执行发现
在剧本里面直接定义vars > facts组件关键字直接调用

三、执行剧本时传入变量,使用-e参数传入变量


# vim vars.yaml
---
 - hosts: web1
   vars:
   - IP1: "{{ ansible_ens33['ipv4']['address'] }}"
   - IP2: "192.168.58.11"
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP1 }}  {{ ansible_hostname }}"
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP2 }}  {{ host_name }}"

执行
# ansible-playbook vars.yaml -e host_name=a2


在执行剧本的时候,使用-e传入变量IP2的值与剧本里面定义的vars变量IP2做对比
# ansible-playbook vars.yaml -e host_name=a2 -e IP2=192.168.58.111

执行后发现
使用-e参数传入变量 > 在剧本里面直接定义vars > facts组件关键字直接调用

四、调用外部变量文件

# vim a.yaml
---
- IP1: "{{ ansible_ens33['ipv4']['address'] }}"
- IP2: "192.168.58.11"
- host_name: a2
- ansible_hostname: A2

# vim vars.yaml
---
 - hosts: web1
   vars_files:
   - /root/a.yaml
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP1 }}  {{ ansible_hostname }}"
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP2 }}  {{ host_name }}"

执行
# ansible-playbook vars.yaml 

发现
调用外部变量文件 > facts组件关键字直接调用


在剧本里面定义与外部变量文件相同的变量ansible_hostname,比较优先级
# vim vars.yaml
---
 - hosts: web1
   vars_files:
   - /root/a.yaml
   vars:
   - ansible_hostname: AA2
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP1 }}  {{ ansible_hostname }}"
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP2 }}  {{ host_name }}"


执行大发现
调用外部变量文件 > 在剧本里面直接定义vars


执行剧本时使用-e参数传入变量ansible_hostname,与外部变量文件里面定义的变量ansible_hostname,比较优先级
# ansible-playbook vars.yaml -e ansible_hostname=AAA2

发现  使用-e参数传入变量 > 调用外部变量文件

五、主机清单传入变量

# vim /etc/ansible/hosts 
[web1]
ansible2

[web2]
ansible3

[web3]
ansible2
ansible3

传入单个主机
# vim /etc/ansible/hosts 
[web3]
ansible2 IP1=192.168.58.10 IP2=192.168.58.11 host_name=a2
ansible3 IP1=192.168.58.20 IP2=192.168.58.21 host_name=a3

# vim vars.yaml
---
 - hosts: web3
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP1 }}  {{ ansible_hostname }}"
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP2 }}  {{ host_name }}"


组变量
# vim /etc/ansible/hosts 
[web3]
ansible2 IP1=192.168.58.10 IP2=192.168.58.11 host_name=a2
ansible3

[web3:vars]
IP1=192.168.58.30
IP2=192.168.58.31
host_name=A3

# vim vars.yaml
---
 - hosts: web3
   tasks:
   - name: copy /tmp/hosts
     copy:
       src: /tmp/hosts
       dest: /tmp/
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP1 }}  {{ ansible_hostname }}"
   - name:
     lineinfile:
       path: /tmp/hosts
       regexp: "没有这个匹配项"
       line: "{{ IP2 }}  {{ host_name }}"


执行后发现
传入单个主机变量 > 组变量

在单个主机后面定义变量ansible_hostname,与facts组件关键字ansible_hostname进行优先级比较

# vim /etc/ansible/hosts
[web3]
ansible2 IP1=192.168.58.10 IP2=192.168.58.11 host_name=a2 ansible_hostname=aa2
ansible3 ansible_hostname=aa3

[web3:vars]
IP1=192.168.58.30
IP2=192.168.58.31
host_name=A3

执行后发现
facts组件关键字直接调用 > 传入单个主机变量 > 组变量

 

总结:

使用-e参数传入变量 > 调用外部变量文件 > 在剧本里面直接定义vars > facts组件关键字直接调用 > 传入单个主机变量 > 组变量
 

六、通过roles传递变量

defaults目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,通常,defaults/main.yml文件中的变量都用于设置默认值,以便在你没有设置对应变量值时,变量有默认的值可以使用,定义在defaults/main.yml文件中的变量的优先级是最低的。

vars目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,看到这里你肯定会有疑问,vars/main.yml文件和defaults/main.yml文件的区别在哪里呢?区别就是,defaults/main.yml文件中的变量的优先级是最低的,而vars/main.yml文件中的变量的优先级非常高,如果你只是想提供一个默认的配置,那么你可以把对应的变量定义在defaults/main.yml中,如果你想要确保别人在调用角色时,使用的值就是你指定的值,则可以将变量定义在vars/main.yml中,因为定义在vars/main.yml文件中的变量的优先级非常高,所以其值比较难以覆盖。