打印playbook变量
var01.yaml
---
- hosts: ubuntu
vars:
foo: bar
tasks:
# Prints "Variable 'foo' is set to bar".
- debug: msg="Variable 'foo' is set to {{ foo }}"
打印文件中的变量
var02.yaml
---
- hosts: ubuntu
vars_files:
vars.yaml
tasks:
# Prints "Variable 'foo' is set to bar".
- debug: msg="Variable 'foo' is set to {{ foo }}"
vars.yaml
---
foo: bar
Ansible的内置环境变量
Ansible的内置环境变量,用setup模块可以查看到
这种语法是Ansible提供的一种“优先级”机制,用于指定一个文件列表,Ansible将根据顺序加载第一个存在的文件,而不会加载多个文件。具体来说,它的工作原理如下:
工作原理:
- Ansible会按顺序检查列表中的文件,并加载第一个找到的文件。
- 如果第一个文件存在且可以加载,Ansible会立即停止检查后续文件。
- 如果第一个文件不存在或无法加载,Ansible会继续检查下一个文件,直到找到一个存在的文件为止。
[ "apache_{{ ansible_os_family }}.yml", "apache_default.yml" ]的写法是为了在多个文件中,依次从左到右选择一个最合适的加载,而不是同时加载多个文件。这是为了避免变量覆盖或冲突,并确保使用最优配置。
这种写法会确保两个文件(如果存在)都会被加载
var03.yaml
---
- hosts: ubuntu
vars_files:
- [ "apache_{{ ansible_os_family }}.yml", "apache_default.yml" ]
tasks:
- service: name={{ apache }} state=restarted
host_vars和group_vars变量
mkdir -p /etc/ansible/hosts_vars
vim /etc/ansible/hosts_vars/107.151.199.209
---
foo: bar
baz: qux
mkdir -p /etc/ansible/group_vars
vim /etc/ansible/group_vars/ubuntu
---
tar: zar
ping: pong
var04.yaml
---
- hosts: ubuntu
#debug 打印多个变量,host_vars和group_vars是默认加载的
tasks:
- name: debug vars
debug:
msg:
#打印主机变量
- "{{ foo }}"
- "{{ baz }}"
#打印主机组变量
- "{{ tar }}"
- "{{ ping }}"
注册变量,数组变量
数组变量,这里写入到/etc/ansible/group_vars/ubuntu
foo_list:
- one
- two
- three
读取列表的第一个变量
foo[0]
foo|first
打印ansible内置变量
hostvars: 从一台远程主机上获取另一台远程主机的变量信息,变量hostvars包含了指定主机上所定义的所有变量
var05.yaml
---
- hosts: ubuntu
tasks:
- name: get time
command: date +"%Y-%m-%d %H:%M:%S"
register: date_fmt
- name: print time
debug:
var: date_fmt.stdout
#打印变量要使用"{{}}",可以保证稳定读取
- name: print time
debug:
msg: "{{ date_fmt.stdout }}"
- name: print time
debug:
msg: "{{ date_fmt.stdout }}"
- name: print foo_list first name with Python语法格式
debug:
msg: "{{ foo_list[0] }}"
- name: print foo_list first name with Jinja2语法
debug:
msg: "{{ foo_list|first }}"
- name: print Ansible built-in vars ansible_eth0
debug:
msg: "{{ ansible_eth0.ipv4.address }}"
- name: print Ansible built-in vars ansible_eth0 #推荐使用 ansible_eth0['ipv4']['address']
debug:
msg: "{{ ansible_eth0['ipv4']['address'] }}"
- name: print Ansible built-in vars ansible_eth0 #hostvars 打印网络接口控制器
debug:
msg: "{{ hostvars['107.151.199.209']['ansible_eth0']['pciid'] }}"
ansible 常用的变量
groups: 包含了所有Hosts文件里主机组的一个列表
group_names: 包含了当前主机所在的所有主机组名的一个列表
inventory_hostname: 通过Hosts文件定义主机的主机名(与ansible_home不一定相同)
inventory_hostname_short: 主机端口
play_hosts: 所有主机
ansible_os_family: 系统类型
ansible_hostname: 主机名称
ansible_memtotal_mb: 内存大小
这些变量通过与when语句的判断条件一起,来决定下一步的操作
var06.yaml
---
- hosts: ubuntu
tasks:
- name: print vars
debug:
msg:
- "groups: {{groups}}"
- "group_names: {{group_names}}"
- "inventory_hostname: {{inventory_hostname}}"
- "inventory_hostname_short: {{inventory_hostname_short}}"
- "play_hosts: {{play_hosts}}"
- "ansible_os_family: {{ansible_os_family}}"
- "ansible_hostname: {{ansible_hostname}}"
- "ansible_memtotal_mb: {{ansible_memtotal_mb}}"
#打印变量要使用"{{}}",可以保证稳定读取
Facts收集系统信息
Ansible默认会先抓取所有主机的系统信息,这些信息我们称之为 Facts
PLAY [group] **********************************************************
GATHERING FACTS *******************************************************
ok: [host1]
ok: [host2]
ok: [host3]
Facts信息包括远程主机的CPU类型,IP地址,磁盘空间,操作系统信息以及网络接口信息等
用setup模块来获取对应主机上面的所有可用的Facts信息,这些信息对于Playbook的运行至关重要
我们可以根据这些信息来决定是否要继续运行下一步任务,或者将这些信息写入某个配置文件中
在某些用不到Facts信息的Playbook任务中,我们可以在Playbook中设置gather_facts:no,节省更多的时间
本地Facts变量
在远程主机本地定义Facts变量的方法
我们可以把需要定义的变量写进一个以 .fact 结尾的文件中,这个文件可以是JSON文件或INI文件,或者是一个可以返回JSON代码的可执行文件,然后将其放置在 /etc/ansible/facts.d 文件夹中,Asnible在执行任务时会自动到这个文件夹下读取变量信息
我们在远程主机上创建了一个.fact文件 /etc/ansible/facts.d/test.fact
内容如下[users]
admin=jane,john
normal=jim
返回结果如下
ansible ubuntu -m setup -a "filter=ansible_local"
107.151.199.209 | SUCCESS => {
"ansible_facts": {
"ansible_local": {
"test": {
"users": {
"admin": "jane,john",
"normal": "jim"
}
}
},
"discovered_interpreter_python": "/usr/bin/python3.10"
},
"changed": false
}
定义本地Facts的方法通常作为一种临时的定义变量的手段,我们还是建议将变量集中定义在Asnsible服务器端集中管理 但是在某些特殊情况下,比如 远程主机的系统环境经常发生变化 ,我们就需要在/etc/ansible/facts.d下使用脚本文件来动态地生成Facts变量
浙公网安备 33010602011771号