变量分类
定义变量分为如下三种方式:
- 通过命令行进行变量定义
- 在playbook文件中进行定义变量
- 通过inventory在主机组或单个主机中设置变量
变量生效的优先级
命令行定义的变量---->play文件定义的变量---->inventory文件定义的变量。
定义变量
注意: 如果变量是开头的时候 加上双引号 ""
key: value 形式
cat 05.yml
- hosts: lbvars:- soft01: nc- soft02: nmaptasks:- name: Install Software nc nmapyum:name:- "{{ soft01 }}"- "{{ soft02 }}"state: present
vars_files指定文件
cat vars.yml
soft01: nc
soft02: nmapcat 06.yml
- hosts: lbvars_files: ./vars.ymltasks:- name: Install Software nc nmapyum:name:- "{{ soft01 }}"- "{{ soft02 }}"state: present
在命令行指定变量
ansible-playbook 08.yml -e "file_name=zqf_extra-vars"
变量的层级定义
cat vars_file.yml
lamp:web:web_package: httpddb_package: mariadb-serverphp_package: phpcat test.yml
---
- hosts: allvars_files:- vars_file.ymltasks:- name: Installed httpdyum: name={{ lamp['web']['web_package'] }}- name: Install Mariadbyum: name={{ lamp.web.db_package }}
变量注册
register关键字可以将某个task任务结果存储至变量中,最后使用debug输出变量内容,可以用于后续排障
register 类似于命令行的 $?, 取出本模块的执行情况
cat 10.yml
- hosts: lbtasks:- name: print ip addrshell: hostname -Iregister: ip_addr- name: echodebug: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_kylinbecome: yesremote_user: roottasks:- name: 检查 Docker 版本shell: docker --versionregister: 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: lbtasks:- name: echodebug: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: webgather_facts: no # 关闭信息采集tasks:- name: install nginxyum: 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: webserverstasks:- name: Installed Memcachedyum: name=memcached state=present- name: Configure Memcachedtemplate: src=./memcached.j2 dest=/etc/sysconfig/memcached- name: Start Memcachedservice: name=memcached state=started enabled=yes