简介
定义:使用固定的值去代表不固定的值,变量需要自己手动修改
为什么要使用变量
简化playbook项目的维护,使用一个固定的字符串表示一个不固定的值
比如说我们要下载包:
wget nginx-1.6.0的包,随着包版本更新,需要下载新的包,这时候需要我们将wget nginx-1.6.0.tar.gz 修改为wget nginx-{{ nginx_version }}.tar.gz。变量会用双花括号表示,内部写变量名称
定义变量:
通过playbook文件中的play进行定义,通过vars定义
定义变量:
vars:
-v1:value1
-v2:value2
-v3:value3
练习
vim vars_1.yaml
- hosts: ljh
vars:
- web_packages: httpd-2.4.6
- ftp_packages: vsftpd-3.0.2
tasks:
- name: installed {{web_packages}} {{ ftp_packages }} packages
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
变量增加到name中可以显示详细版本号
通过inventory主机清单进行变量定义
通过定义一个变量文件,然后使用playbook进行调用
结构:
在当前目录创建一个vars_pub.yaml,用于存放包名
vim vars_pub.yaml
web_packages: httpd-2.4.6
ftp_packages: vsftpd-3.0.2
vim vars_1.yaml
- hosts: ljh
vars_files:
- ./vars_pub.yaml
tasks:
- name: installed {{web_packages}} {{ ftp_packages }} packages
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
执行结果
inventory清单创建
方式一(少见可以忽略):
vim /etc/ansible/hosts
vim var3.yaml
- hosts: ljh
tasks:
- name: create file
file: path=/tmp/{{ file_name }} state=touch
在/tmp下创建一个文件调用hosts文件中的名字:group_vars
执行并检测查看客户端是否生成group_vars文件:
ansible-playbook var3.yaml
客户端查看:
方式二:官方推荐
定义group_vars
创建两个目录
mkdir host_vars
mkdir group_vars
创建用户文件
vim group_vars/ljh
web_packages: wget
ftp_packages: tree
创建调用脚本
vim vars_4.yaml
- hosts: ljh
tasks:
- name: installed {{ web_packages }} {{ ftp_packages }} packages
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
这里的脚本不需要再加入var_files,因为系统会自动在当前目录寻找目录host_vars和group_vars,然后自动寻找下面的文件中的模块和包
检测
host_vars和group_vars目录下的文件名称模块匹配,如果还想使用第二个playbook需要自己重新创建file_vars,需要在hosts文件中先创建一个db清单,把原先的ljh文件复制修改名字为db,列出安装包列表
vim /etc/ansible/hosts
vim group_vars/db
web_packages: wget
ftp_packages: tree
vim vars_4.yaml
- hosts: db
tasks:
- name: installed {{ web_packages }} {{ ftp_packages }} packages
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
如果出现很多清单怎么办呢?
想要被共享的目录清单需要将文件名字改成all
mv group_vars/ljh group_vars/all
这样所有playbook都可以调用all里面的模块
总结:
默认情况下,groups_vars目录中文件名与hosts清单中的组名保持一致,如果在group_vars目录中创建了ljh组的变量,其他组是无法使用ljh组的变量。所以系统提供了一个特殊组,all,只需要在group_vars目录下建立一个all文件,编写好变量,所有组都可以使用
定义host_vars
类似于group_vars创建方式,在host_vars目录中创建一个文件,文件名与inventory清单中的主机名称要保持一致,如果是IP地址,则创建相同ip地址的文件即可
清单文件内容
vim /etc/ansible/hosts
创建列表文件
创建和ip相同的文件
编辑列表文件
cat 192.168.1.11
web_packages: pcre-devel
ftp_packages: zlib-devel
cat 192.168.1.12
这里什么都不用写,检测是否会调用group中的内容,顺便检测优先级
配置playbook
vim vars_5.yml
- hosts: 192.168.1.11
tasks:
- name: installed {{ web_packages }} {{ ftp_packages }} packages
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
- hosts: 192.168.1.12
tasks:
- name: installed {{ web_packages }} {{ ftp_packages }} packages
yum:
name:
- "{{ web_packages }}"
- "{{ ftp_packages }}"
state: present
测试一下是否可以单独调用各自的配置文件
执行
ansible-playbook vars_5.yml
总结:
host_vars 特殊的变量目录,针对单个主机进行变量
group_vars 特殊的变量目录,针对inventory主机清单中的组进行定义,对A组定义的变量 B组无法调用
group_vars/all 特殊的变量文件,可以针对所有的主机组定义变量
优先级为host_vars>group_vars
通过执行playbook时使用-e参数指定变量
vim /etc/ansible/hosts
vim vars_4.yaml
ansible-playbook vars_4.yaml
可以直接对两个组进行执行
还可以通过命令行进行执行
vim vars_4.yaml
使用-e指定变量host就是ljh
ansible-playbook vars_4.yaml -e "host=ljh"
指定变量host是db就执行db
如果在命令行重新指定变量,则会按照命令行为优先级最高规则执行
ansible-playbook vars_5.yaml -e web_packages=lrzsz
测试优先级
测试思路:
在playbook中定义vars变量
在playbook中定义vars_files变量,在当前目录中创建列表
在host_vars中定义变量
在group_vars中定义变量
通过执行命令传递变量
vim ceshi.yaml
- hosts: ljh
tasks:
- name: create variables {{ file_name }}
file: path=/tmp/{{ file_name }} state=touch
playbook
vim ceshi.yaml
- hosts: ljh
#操作1在palybook中直接定义vars变量
vars:
file_name: play_vars
#操作2在playbook中定义vars_files变量,在当前目录中创建列表
vars_files: ./vars_pub.yaml
tasks:
- name: create variables {{ file_name }}
file: path=/tmp/{{ file_name }} state=touch
修改文件:
vim vars_pub.yaml
vim host_vars/192.168.1.11
vim group_vars/ljh
vim group_vars/all
测试
外置wz_file优先级最高
去掉外置直接执行
可知当前目录创建列表优先级第二
注释掉vars_files指定的内容继续执行
vim ceshi.yaml
ansible-playbook ceshi.yaml
可知playbook中直接定义的play_vars优先级为第三
注释掉vars继续执行
vim ceshi.yaml
ansible-playbook ceshi.yaml
删掉hosts_vars_gf继续执行
vim host_vars/192.168.1.11
ansible-playbook ceshi.yaml
优先级继续降到group_vars
删除继续执行
vim group_vars/ljh
ansible-playbook ceshi.yaml
总结:外置传参>playbook(vars_files>vars)>inventory(host_vars/host>group_vars/group_name>group_vars/all)
变量注册
vim vars_6.yaml
- hosts: ljh
tasks:
- name: yum -y install httpd
yum: name=httpd state=present
- name: systemctl start httpd
service: name=httpd state=started
- name: check httpd server
shell: ps aux|grep httpd
register: check_httpd
- name: output variables
debug:
msg: "{{check_httpd}}"
输出结果
ansible-playbook vars_6.yaml
修改配置文件,加入.stdout_lines
一般更常见的是加入stdout
重新执行
修改其他输出结果配置
总结:
facts变量
采集变量
setup 模块用来采集被控端状态指标,比如:IP地址,主机名称,cpu信息,内存等
ansible 192.168.1.11 -m setup > facts.txt
cat facts.txt
ip信息
系统版本信息
网卡信息
默认情况下facts变量名都已经预先定义好了,只需要采集被控端的信息,然后传递至facts变量即可
关闭方式
再执行汇报错,找不到变量
练习:获取主机名和IP地址
vim 1.yaml
- hosts: ljh
tasks:
- name: output variables ansible facts
debug:
msg: IPv4 address "{{ ansible_fqdn }}" is "{{ ansible_default_ipv4.address }}"
ansible-playbook 1.yaml
fqdn为主机名
输出
其他练习:
1通过facts变量检查被控端硬件CPU信息,而是生成不同Nginx配置文件
很多情况下,我们希望通过不同的服务器中的不同cpu修改不同配置文件中的参数实现最适合的参数发挥,所以需要在不同服务器中的相同配置文件配置不同的参数信息
2通过facts变量检测被控端主机名称信息,从而生成不同zabbix配置文件
简介:vim /etc/zabbix/zabbix_agentd.conf
zabbix server把配置文件拷贝到ansible server去
scp /etc/zabbix/zabbix_agentd.conf 192.168.1.10:/root/zabbix_agentd.conf.j2
vim 1.yaml
这里注意:
copy:将文件原样拷贝
template:会将拷贝的文件进行变量解析,然后再分发
受控端检测是否成功:
3通过facts变量检查被控制端内存状态信息,从而生成不同memcached配置文件
memcached了解
准备两台物理内存不一样的虚拟机:
192.168.1.11:2G
192.168.1.12:1G
控制端下载memcached
yum -y install memcached
vim /etc/sysconfig/memcached
开启memcached
systemctl start memcached
检测
netstat -anput | grep 11211
获取内存信息
ansible ljh -m setup | grep mem
配置
vim 1.yaml
- hosts: ljh
tasks:
- name: yum -y install memcached
yum: name=memcached state=present
- name: configure memcached server
template: src=./memcached.j2 dest=/etc/sysconfig/memcached
- name: service start memcached
service: name=memcached state=started enabled=yes
- name: check memcached server
shell: ps aux | grep memcached
register: check_mem
- name: debug memcached variables
debug:
msg: "{{ check_mem.stdout_lines }}"
cp /etc/sysconfig/memcached ./memcached.j2
vim ./memcached.j2
说明:
/ 除法
// 除法,取整
ansible-playbook 1.yaml
测试
cat /etc/sysconfig/memcached
4:修改memcached最大连接数和端口号
5:通过facts变量渲染出不同主机nginx配置文件
work_process和cpu核心数保持一致即可
yum -y install nginx
cp -a /etc/nginx/nginx.conf ./nginx.conf.j2
ansible ljh -m setup | grep -C 3 cores
vim nginx.conf.j2
vim 1.yaml
- hosts: ljh
tasks:
- name: yum -y install nginx
yum: name=nginx state=present
- name: configure nginx server
template: src=./nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: service start nginx
service: name=nginx state=started enabled=yes
- name: check nginx server
shell: ps aux | grep nginx
register: check_cpu
- name: debug nginx variables
debug:
msg: "{{ check_cpu.stdout_lines }}"
ansible-playbook 1.yaml
6:批量修改服务器主机名称(hostname)8-10位随机数
随机数生成方式:
echo $RANDOM|md5sum| cut -c 5-12
ansible-playbook 1.yaml
输出内容太多了,修改一下
- hosts: ljh
tasks:
- name: shell
shell: echo $RANDOM | md5sum | cut -c 5-12
register: get_random
- name: debug
debug:
msg: "{{ get_random.stdout_lines }}"
输出结果
成功修改
7:批量修改主机名称,要求web_IP
vim 1.yaml
- hosts: ljh
tasks:
- name: get facts
debug:
msg: "{{ ansible_default_ipv4.address }}"
- name: hostname change
hostname: name=web_{{ ansible_default_ipv4.address }}
内置主机变量
所谓内置变量其实就是ansible.cfg配置文件中的选项,在其前加上 ansible_ 即成为内置变量。当然 内置变拥有比ansible.cfg中选项更高的优先级,而且针对不同的主机,可以定义不同的值。 之所以叫内置主机变量,其实就是这些变量一般写在inventory的主机或主机组中。
# 一般连接
ansible_host #用于指定被管理的主机的真实IP
ansible_port #用于指定连接到被管理主机的ssh端口号,默认是22
ansible_user #ssh连接时默认使用的用户名
# 特定ssh连接
ansible_connection #SSH连接的类型:local, ssh, paramiko,在ansible 1.2 之前默认是
paramiko,后来智能选择,优先使用基于ControlPersist的ssh(如果支持的话)
ansible_ssh_pass #ssh连接时的密码
ansible_ssh_private_key_file #秘钥文件路径,如果不想使用ssh‐agent管理秘钥文件时可以使用此选项
ansible_ssh_executable #如果ssh指令不在默认路径当中,可以使用该变量来定义其路径
# 特权升级
ansible_become #相当于ansible_sudo或者ansible_su,允许强制特权升级
ansible_become_user #通过特权升级到的用户,相当于ansible_sudo_user或者ansible_su_user
ansible_become_pass # 提升特权时,如果需要密码的话,可以通过该变量指定,相当于
ansible_sudo_pass或者ansible_su_pass
ansible_sudo_exec #如果sudo命令不在默认路径,需要指定sudo命令路径
# 远程主机环境参数
ansible_shell_executable # 设置目标机上使用的shell,默认为/bin/sh
ansible_python_interpreter #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指
定ruby 、perl 的路径
ansible_*_interpreter #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以
是ruby或才perl等其他语
示例: 定义server1主机的ansible_host变量,以及定义主机组[init_server]的组变量
[init_server]
server1 ansible_host=192.168.1.10
192.168.1.11
192.168.1.12
[init_server:vars]
ansible_ssh_pass=123
#ansible_ask_pass=False
#ansible_user=root
魔法变量
1 hostvars 2 group(groups、group_names)3 inventory(inventory_hostname、inventory_dir、inventory_file)
Ansible默认会提供一些内置的变量以实现一些特定的功能,我们称之为魔法变量。
1. hostvars
获取inventory中定义的所有主机的相关变量。
例如:hosts文件如下
[dev]
node1
[test]
node2
[prod]
node3
node4
[balancers]
node5
[webservers:children]
prod
playbook将会在获取到所有主机上的相关变量
hostvar.yaml
- hosts: prod
gather_facts: no
tasks:
- name: debug
debug:
msg:
- "{{ hostvars }}"
2. inventory_hostname
inventory_hostname是Ansible所识别的当前正在运行task的主机的主机名。如果在inventory里定 义过别名,那么这里就是那个别名,如果inventory包含如下一行:
node1 ansible_ssh_host=192.168.1.10
则 inventory_hostname 即为 node1
示例1: 利用 hostvars 和 inventory_hostname 变量,可以输出与当前主机相关联的所有变量
- hosts: prod
gather_facts: no
tasks:
- name: debug
debug:
msg:
- "{{ hostvars[inventory_hostname] }}"
输出结果:
ok: [node3] => {
"msg": [
{
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
"ansible_forks": 5,
"ansible_inventory_sources": [
"/home/greg/ansible/inventory"
],
"ansible_playbook_python": "/usr/bin/python2",
"ansible_run_tags": [
"all"
],
"ansible_skip_tags": [],
"ansible_verbosity": 0,
"ansible_version": {
"full": "2.9.27",
"major": 2,
"minor": 9,
"revision": 27,
"string": "2.9.27"
},
"group_names": [ # 主机所属主机组
"prod",
"webservers"
],
"groups": { # 所有主机组的列表,枚举主机组中的所有主机
"all": [
"node5",
"node1",
"node2",
"node3",
"node4"
],
"balancers": [
"node5"
],
"dev": [
"node1"
],
"prod": [
"node3",
"node4"
],
"test": [
"node2"
],
"ungrouped": [],
"webservers": [
"node3",
"node4"
]
},
"inventory_dir": "/home/greg/ansible", # 机清单所在目录
"inventory_file": "/home/greg/ansible/inventory", # 主机清单文件
"inventory_hostname": "node3", # Ansible所识别的当前正在运行task的主机的主机名
"inventory_hostname_short": "node3",
"playbook_dir": "/home/greg/ansible"
}
]
}
ok: [node4] => {
"msg": [
{
"ansible_check_mode": false,
"ansible_diff_mode": false,
"ansible_facts": {},
"ansible_forks": 5,
"ansible_inventory_sources": [
"/home/greg/ansible/inventory"
],
"ansible_playbook_python": "/usr/bin/python2",
"ansible_run_tags": [
"all"
],
"ansible_skip_tags": [],
"ansible_verbosity": 0,
"ansible_version": {
"full": "2.9.27",
"major": 2,
"minor": 9,
"revision": 27,
"string": "2.9.27"
},
"group_names": [
"prod",
"webservers"
],
"groups": {
"all": [
"node5",
"node1",
"node2",
"node3",
"node4"
],
"balancers": [
"node5"
],
"dev": [
"node1"
],
"prod": [
"node3",
"node4"
],
"test": [
"node2"
],
"ungrouped": [],
"webservers": [
"node3",
"node4"
]
},
"inventory_dir": "/home/greg/ansible",
"inventory_file": "/home/greg/ansible/inventory",
"inventory_hostname": "node4",
"inventory_hostname_short": "node4",
"playbook_dir": "/home/greg/ansible"
}
]
}
3. group_names
group_names返回的是主机所属主机组,如果该主机在多个组中,则返回多个组,如果它不在组 中,则返回ungrouped这个特殊组。
ansible node3 -m debug -a "msg='{{ group_names }}'"
4. groups
groups是inventory中所有主机组的列表,可用于枚举主机组中的所有主机。
5. play_hosts
当前playbook会在哪些hosts上运行。
6. inventory_dir
机清单所在目录
7. inventory_file
主机清单文件
发布者:LJH,转发请注明出处:https://www.ljh.cool/33535.html