Ansible变量
Ansible 中定义变量的方式
优先级:作用域越小,优先级越高
主机清单(inventory)
# 主机清单展示
[db_group]
db01 ansible_ssh_host='10.0.0.51'
[wd:children]
web_group
nfs
[nfs]
nfs01 ansible_ssh_host='10.0.0.31'
[backup]
backup01 ansible_ssh_host='10.0.0.41'
[all:vars]
user='ylsb1'
id='438'
[web_group:vars]
user='yldsb2'
id='1438'
# 剧本展示
- hosts: all
# vars_files:
# - ./bl.yml
tasks:
- name: 创建"{{ user }}"组
group:
name: "{{ user }}"
gid: "{{ id }}"
state: present
- name: 创建"{{ user }}"用户
user:
name: "{{ user }}"
uid: "{{ id }}"
group: "{{ id }}"
shell: /sbin/nologin
create_home: false
官方推荐定义变量方式
1.根据主机清单中的标签名或者主机名,来创建对应的yaml文件
2.如果是标签名,就将yaml文件创建在group_vars目录下
3.如果是主机名,就将yaml文件创建在host_vars目录下
4.host_vars和group_vars两个目录,必须和playbook在同一级目录下
# 例:主机清单如下
[db_group]
db01 ansible_ssh_host='10.0.0.51'
[wd:children]
web_group
nfs
[nfs]
nfs01 ansible_ssh_host='10.0.0.31'
[backup]
backup01 ansible_ssh_host='10.0.0.41'
- host_vars
- web01.yaml
- web02.yaml
- nfs01.yaml
- group_vars
- web_group.yaml
- db_group.yaml
剧本playbook
- vars
# 变量值写法
- hosts: all
vars:
user: "web"
id: "1234"
tasks:
- name: 创建"{{ user }}"组
group:
name: "{{ user }}"
gid: "{{ id }}"
state: present
- name: 创建"{{ user }}"用户
user:
name: "{{ user }}"
uid: "{{ id }}"
group: "{{ id }}"
shell: /sbin/nologin
create_home: false
- vars_files
# 变量分组
vim bl.yml
user: "sss"
id: "432"
# 变量文件写法
- hosts: all
vars_files:
- ./bl.yml
tasks:
- name: 创建"{{ user }}"组
group:
name: "{{ user }}"
gid: "{{ id }}"
state: present
- name: 创建"{{ user }}"用户
user:
name: "{{ user }}"
uid: "{{ id }}"
group: "{{ id }}"
shell: /sbin/nologin
create_home: false
命令行
通过命令行覆盖变量,Inventory
(主机清单)的变量会被playbook
(剧本)文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用--extra-vars或者-e设置变量
#例:
ansible-playbook wordpress.yaml -i hosts -e 'user=tls555 id=55555'
ansible变量的优先级
#例:把其他所有变量方式都设置好,并使用命令行变量进行操作
ansible-playbook test.yaml -i hosts -e 'test=command'
#得出结论:
命令行 > 剧本 playbook > 主机清单 inventory
命令行 > vars_files > vars > host_vars > group_vars > inventory
# 官方推荐:
- host_vars
- group_vars
# linux中优先级规律:作用域越小,优先级越高
ansible变量的注册
为什么要用变量注册?
有些时候,我们需要查看playbook执行后返回的结果
ls -l /root
free -m
df -h
但是ansible剧本只返回,运行后的状态,绿色 黄色 红色
所以需要使用注册变量,将执行的结果,保存到一个变量名中
register:注册,将命令结果保存在指定的变量名中
#例:
- hosts: web_group
tasks:
- name: 查看所有web的/root目录下都有哪些文件
shell: 'ls -l /root'
register: dsb_yl
- name: 查看 dsb_yl 变量的值
debug:
msg: "{{ dsb_yl['stdout_lines'] }}"
# 变量注册判断举例
- hosts: web02
tasks:
- name: 检测是否安装nginx
shell: 'rpm -qa|grep nginx'
register: check_nginx
- name: 安装nginx和php
shell: 'rpm -ivh /opt/nginx_php/*.rpm'
when: check_nginx.rc != 0
- name: 创建zls目录
file:
path: /tmp/zls
state: directory
层级定义变量
# 例子展示
lnmp:
framerwork:
package:
web_pkg:nginx
db_pkg:mysql
code_pkg:php-fpm
lamp:
framerwork:
package:
web_pkg:httpd
db_pkg:mysql
code_pkg:php-fpm
lamt:
framerwork:
package:
web_pkg:httpd
db_pkg:mysql
code_pkg:tomcat
# 引用方法
{{ lnmp.framerwork.package.web_pkg }}
## 变量定义展示
framework:
package:
web_pkg: nginx-1.19.2
db_pkg: oracle
code_pkg: php-fpm
## 剧本中调用变量
- hosts: web_group
tasks:
- name: 创建目录
file:
path: /opt/{{ lnmp.framework.package.db_pkg }}
state: directory
- name: 安装lnmp
yum:
name:
- {{ framework.package.web_pkg }}
- {{ framework.package.db_pkg }}
- {{ framework.package.code_pkg }}
## 所有变量展示
framework:
lnmp:
web_pkg: nginx-1.19.2
db_pkg: mariadb-server
code_pkg: php-fpm
lamt:
web_pkg: httpd
db_pkg: mariadb-server
code_pkg: tomcat
lamp:
web_pkg: httpd
db_pkg: mariadb-server
code_pkg: php-fpm
## 调用变量
- hosts: web_group
tasks:
- name: 安装lnmp
yum:
name:
- "{{ framework.lnmp.web_pkg }}"
- "{{ framework.lnmp.db_pkg }}"
- "{{ framework.lnmp.code_pkg }}"
ansible的facts缓存
playbook在执行之前,使用setup
模块获取所有主机信息,获取所有变量(内置变量)
# 使用setup模块
ansible web01 -m setup
# facts缓存
TASK [Gathering Facts]
ok: [web02]
ok: [web01]
# /etc/motd
欢迎登录 {{ ansible_hostname }}
内网IP:{{ ansible_eth1.ipv4.address }}
外网IP:{{ ansible_eth0.ipv4.address }}
总内存:{{ ansible_memtotal_mb }}
可用内存:{{ ansible_memfree_mb }}
# /opt/
- hosts: web_group
tasks:
- name: 创建{{ ansible_hostname }}目录
file:
path: /opt/{{ ansible_hostname }}
state: directory
- name: 创建{{ ansible_eth1.ipv4.address }}目录
file:
path: /opt/{{ ansible_eth1.ipv4.address }}
state: directory
- name: 创建{{ ansible_eth0.ipv4.address }}目录
file:
path: /opt/{{ ansible_eth0.ipv4.address }}
state: directory
- name: 创建{{ ansible_memtotal_mb }}目录
file:
path: /opt/{{ ansible_memtotal_mb }}
state: directory
- name: 创建{{ ansible_memfree_mb }}目录
file:
path: /opt/{{ ansible_memfree_mb }}
state: directory
## 关闭facts缓存
gather_facts: no
在数据库配置文件中设置内存(主机的物理内存的80%)