ansible的变量详解
变量分类
定义变量分为如下三种方式:
- 通过命令行进行变量定义
- 在playbook文件中进行定义变量
- 通过inventory在主机组或单个主机中设置变量
变量生效的优先级
命令行定义的变量---->play文件定义的变量---->inventory文件定义的变量。
定义变量
注意: 如果变量是开头的时候 加上双引号 ""
key: value 形式
cat 05.yml
- hosts: lb
vars:
- soft01: nc
- soft02: nmap
tasks:
- name: Install Software nc nmap
yum:
name:
- "{{ soft01 }}"
- "{{ soft02 }}"
state: present
vars_files指定文件
cat vars.yml
soft01: nc
soft02: nmap
cat 06.yml
- hosts: lb
vars_files: ./vars.yml
tasks:
- name: Install Software nc nmap
yum:
name:
- "{{ soft01 }}"
- "{{ soft02 }}"
state: present
在命令行指定变量
ansible-playbook 08.yml -e "file_name=zqf_extra-vars"
变量的层级定义
cat vars_file.yml
lamp:
web:
web_package: httpd
db_package: mariadb-server
php_package: php
cat test.yml
---
- hosts: all
vars_files:
- vars_file.yml
tasks:
- name: Installed httpd
yum: name={{ lamp['web']['web_package'] }}
- name: Install Mariadb
yum: name={{ lamp.web.db_package }}
变量注册
register关键字可以将某个task任务结果存储至变量中,最后使用debug输出变量内容,可以用于后续排障
register 类似于命令行的 $?, 取出本模块的执行情况
cat 10.yml
- hosts: lb
tasks:
- name: print ip addr
shell: hostname -I
register: ip_addr
- name: echo
debug:
msg: "you ip address is {{ ip_addr.stdout }}"
# 比如变量叫做ip_addr
# ip_addr.stdout_lines: 取出ip
# ip_addr.rc: 返回值 return code $?
# ip_addr.stdout: 标准输出, 屏幕上面的输出
# ip_addr.stderr: 标准错误输出,错误信息.
# 另一个案例:
- hosts: system_kylin
become: yes
remote_user: root
tasks:
- name: 检查 Docker 版本
shell: docker --version
register: docker_version # 变量名应使用下划线而非连字符
- name: 输出 Docker 版本信息
debug:
var: docker_version.stdout # 直接输出命令的标准输出
facts变量
Ansible facts是在被管理主机上通过ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端主机的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
显示所有 ansible facts:
ansible mysql -m setup
facts基本用法,比如获取被控端的主机名与IP地址
cat 12.yml
- hosts: lb
tasks:
- name: echo
debug:
msg:
- "所有的ip地址 {{ ansible_all_ipv4_addresses }}"
- "默认的ip地址 {{ ansible_default_ipv4.address }}"
- "you interface is {{ansible_default_ipv4.interface }}"
- "time is {{ ansible_date_time.date }}"
- "mem total is {{ ansible_memtotal_mb }}"
- "you system is {{ ansible_distribution }} version is {{ ansible_distribution_version }}"
ansible-playbook -C 12.yml
PLAY [lb] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************
ok: [10.0.0.43]
ok: [10.0.0.42]
TASK [echo] ******************************************************************************************************************************************************************************
ok: [10.0.0.42] => {
"msg": [
"所有的ip地址 [u'10.0.0.197', u'10.0.0.42']",
"默认的ip地址 10.0.0.42",
"you interface is ens33",
"time is 2024-01-29",
"mem total is 972",
"you system is CentOS version is 7.9"
]
}
ok: [10.0.0.43] => {
"msg": [
"所有的ip地址 [u'10.0.0.197', u'10.0.0.43']",
"默认的ip地址 10.0.0.43",
"you interface is ens33",
"time is 2024-01-29",
"mem total is 972",
"you system is CentOS version is 7.9"
]
}
PLAY RECAP *******************************************************************************************************************************************************************************
10.0.0.42 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.0.0.43 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
关闭facts
facts开启后会影响Ansible主机的性能,如果没有采集被控端主机需求可选择关闭
cat 13.yml
- hosts: web
gather_facts: no # 关闭信息采集
tasks:
- name: install nginx
yum: name=nginx state=present
查找facts变量
# 通过filter进行过滤 显示我们索要的facts
ansible lb -m setup -a 'filter="*ens33*"'
几个常用的facts变量
ansible_default_ipv4.address # 默认的网卡ip eth0
ansible_distribution # 系统发行版本名字 CentOS Ubuntu Debian ...
ansible_memtotal_mb # 内存大小
ansible_processor_vcpus # 表示主机的虚拟CPU(vCPU)数量
ansible_processor_cores # 表示主机的实际物理核心数。
ansible_date_time.date # 表示主机当前的日期
ansible_hostname # 主机名
ansible_host # ip
案例
使用facts根据不同的内存生成不同Memcached配置文件
# memcached配置文件如下
cat memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}" #根据内存状态生成不同的配置(支持+-*/运算)
OPTIONS=""
#playbook如下
cat 11.yml
- hosts: webservers
tasks:
- name: Installed Memcached
yum: name=memcached state=present
- name: Configure Memcached
template: src=./memcached.j2 dest=/etc/sysconfig/memcached
- name: Start Memcached
service: name=memcached state=started enabled=yes

浙公网安备 33010602011771号