一、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组件关键字直接调用 > 传入单个主机变量 > 组变量
六、
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文件中的变量的优先级非常高,所以其值比较难以覆盖。