# 变量优先级 inventory -- group_vars -- host_vars -- register -- vars -- vars_files -- cmdlines①、在配置文件中定义
- 在inventory中定义(变量优先级最低) webserver nginx
# 修改配置文件
[root master ansible]# head /etc/ansible/hosts
[agent]
agent1 webserver nginx
agent2
agent3
# 编写yml
[root master ansible]# cat debug.yml
- hosts: agent1
tasks:
- name: debug message
debug:
msg: {{ webserver }}
# 测试
[root master ansible]# ansible-playbook debug.yml
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
msg : nginx
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0
②、在playbook中定义
- 通过vars关键字定义变量 - 通过vars_files关键字引入变量文件
- 通过vars关键字定义变量
# 通过vars关键字定义变量实例
[root master ansible]# cat debug2.yml
- hosts: agent1
vars:
webserver: html
tasks:
- name: debug message
debug:
msg: {{ webserver }}
# 运行测试
[root master ansible]# ansible-playbook debug2.yml
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
msg : html
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0
- 通过vars_files关键字引入变量文件 变量的定义格式成键值对出现 键值对之间可以嵌套 形成一个大字典③、目录定义变量
- 通过host_vars和group_vars目录定义变量 # 在/etc/ansible下 其结构如下 [root master ansible]# tree ├── ansible.cfg ├── debug.yml ├── group_vars ├── hosts ├── host_vars │ └── agent1 ├── register.yml └── roles
# 在ansible文件夹创建host_vars目录
# host_vars下创建指定主机的文件名文件 在文件中指定变量
# example: (给主机3创建web mysql变量)
[root master ansible]# mkdir /etc/ansible/host_vars/
[root master ansible]# vim /etc/ansible/host_vars/agent3
web: mysql
[root master ansible]# vim debug2.yml
- hosts: agent3
tasks:
- name: debug message
debug:
msg: {{ web }}
测试结果如下:
[root master ansible]# ansible-playbook debug2.yml
PLAY [agent3] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent3]
TASK [debug message] ************************************************************************
ok: [agent3] {
msg : mysql
PLAY RECAP **********************************************************************************
agent3 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0
# 在ansible文件夹创建group_vars目录 必须是组名 定义方式和vars一样④、注册变量
- 将某一条任务执行的结果保存下来 通过register关键字来实现讲某一任务保存为一个变量
#examples
[root master ansible]# cat register.yml
- hosts: agent1
tasks:
- name: ls
shell: ls /tmp
register: result
- name: debug
debug:
msg: {{ result }}
- debug:
msg: {{ result.rc }}
#关于输出的debug说明
changed: ansible基于此来判断是否发生了状态改变
cmd: 被调用的命令
failed: 是否运行失败
delta: 任务执行的时间
rc: 返回值 0为正常 非0为异常
stderr: 错误结果输出 输出值是一个字符串
stderr_lines: 错误结果输出 输出值是一个列表
stdout: 正确结果输出 输出值是一个字符串
stdout_lines: 正确结果输出 输出值是一个列表 # 可以对列表进行循环取值
## register.yml 执行结果 (经供参考)
[root master ansible]# ansible-playbook register.yml
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [ls] ***********************************************************************************
changed: [agent1]
TASK [debug] ********************************************************************************
ok: [agent1] {
msg : {
changed : true,
cmd : ls /tmp ,
delta : 0:00:00.002672 ,
end : 2021-06-06 05:42:08.336638 ,
failed : false,
rc : 0,
start : 2021-06-06 05:42:08.333966 ,
stderr : ,
stderr_lines : [],
stdout : ansible_command_payload_9vxnktnpnansible_command_payload_ghdfsyvcnsystemd-private-ad6599e08cee40dd831f840406dfd453-bluetooth.service-r7lrRVnsystemd-private-ad6599e08cee40dd831f840406dfd453-chronyd.service-5Y5DJOnsystemd-private-ad6599e08cee40dd831f840406dfd453-colord.service-gpKvoYnsystemd-private-ad6599e08cee40dd831f840406dfd453-httpd.service-8D5kA0nsystemd-private-ad6599e08cee40dd831f840406dfd453-ModemManager.service-eoY0lTnsystemd-private-ad6599e08cee40dd831f840406dfd453-rtkit-daemon.service-GslSWQnvmware-root_1004-2957649132nvmware-root_1018-2990547707 ,
stdout_lines : [
ansible_command_payload_9vxnktnp ,
ansible_command_payload_ghdfsyvc ,
systemd-private-ad6599e08cee40dd831f840406dfd453-bluetooth.service-r7lrRV ,
systemd-private-ad6599e08cee40dd831f840406dfd453-chronyd.service-5Y5DJO ,
systemd-private-ad6599e08cee40dd831f840406dfd453-colord.service-gpKvoY ,
systemd-private-ad6599e08cee40dd831f840406dfd453-httpd.service-8D5kA0 ,
systemd-private-ad6599e08cee40dd831f840406dfd453-ModemManager.service-eoY0lT ,
systemd-private-ad6599e08cee40dd831f840406dfd453-rtkit-daemon.service-GslSWQ ,
vmware-root_1004-2957649132 ,
vmware-root_1018-2990547707
TASK [debug] ********************************************************************************
ok: [agent1] {
msg : 0
PLAY RECAP **********************************************************************************
agent1 : ok 4 changed 1 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0
⑤、命令行定义变量
- cmdline定义的变量高于一切 优先级最高
写法: ansible-playbook debug.yml -e webserver mysql
ansible-playbook debug.yml --extra-vars { webserver : mysql , test : user }
# example
[root master ansible]# cat debug.yml
- hosts: agent1
tasks:
- name: debug message
debug:
msg: {{ webserver }}
# 正常情况变量为httpds
[root master ansible]# ansible-playbook debug.yml
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
msg : httpds
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0
# 在命令行指定变量后 变量修改为了mysql
[root master ansible]# ansible-playbook debug.yml -e webserver mysql
PLAY [agent1] *******************************************************************************
TASK [Gathering Facts] **********************************************************************
ok: [agent1]
TASK [debug message] ************************************************************************
ok: [agent1] {
msg : mysql
PLAY RECAP **********************************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0
2、ansible变量之fact 魔法变量
- fact变量
①、fact简介
ansible有一个模块叫setup 用于获取远程主机的相关信息 并可以将这些信息作为变量在playbook里进行调用。而setup模块获取这些信息的方法就是依赖于fact
- setup模块用法# 查看所有的fact信息 ansible test -m setup # 查看网卡的信息 ansible test -m setup -a filter ansible_ens160 # 查看主机内存信息 ansible test -m setup -a filter ansible_*_mb # 讲所有主机的信息输入到/tmp/facts目录下 每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)生成为主机名的json文件 ansible all -m setup --tree /tmp/facts- facts数据中经常获取的信息 关键字说明ansible_python_versionansible_ethoansible_distribution显示是何操作系统ansible_distribution_major_version显示系统主版本号ansible_devices显示磁盘设备信息ansible_lvm显示lvm相关信息ansible_memtotal_mb显示系统总内存ansible_kernel显示内核版本ansible_ens160显示网卡ansible_fqdn显示主机fqdn(Fully Qualified Domain Name)全限定域名ansible_hostname显示主机名 - ansible-facts
facts数据的顶级key为ansible_facts 在引用时将其包含在变量表达式中。但自动收集的facts比较特 殊 它以ansible_facts作为key ansible每次收集后会自动将其注册为变量 所以facts中的数据可以 直接通过变量引用 甚至连顶级key ansible_facts都要省略。 *例如引用ipv4的地址 ansible_ens160.ipv4.address 或者写成 ansible_facts.ens160.ipv4.address 而不能写成 ansible_facts.ansible_ens160.ipv4.address- 如何开启关闭收集facts
# 如果不需要用到facts数据 那么我们可以关闭收集facts的功能。也可以用setup模块主动收集facts - host: agent1 gather_facts: false # 关闭自动收集facts,默认是开启 tasks: - name: test gather facts setup:②、自定义fact
- ansible支持为某个主机定制fact 称为本地fact。本地fact默认存放在/etc/ansible/facts.d目录下 且类型为ini格式或json格式时 ansible会自动识别。(以这种形式加载的fact是key为ansible_local的特殊变量) - 在ansible主控端定义一个ini格式的custom.fact文件 [root master ansible]# cat custom.fact [custom] package httpd service httpd state httpd
# 编写playbook 将fact文件发送个被控端 文件必须发送到/etc/ansible/facts.d/下
[root master ansible]# cat def_facts.yml
- hosts: agent1
tasks:
- name: create dir
file:
path: /etc/ansible/facts.d/
state: directory
- name: copy custom facts to agent
copy:
src: /etc/ansible/custom.fact
dest: /etc/ansible/facts.d/custom.fact
- name: debug custom.state
debug:
msg: {{ ansible_local.custom.custom.state }}
# 测试变量定义是否成功
[root master ansible]# ansible-playbook facts2.yml
PLAY [agent1] ******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [agent1]
TASK [get custom.package] ******************************************************
ok: [agent1] {
msg : {
package : httpd ,
service : httpd ,
state : httpd
PLAY RECAP *********************************************************************
agent1 : ok 2 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0
③、set-fact(用处不大)
# set_fact模块 用于拼接变量
- hosts: agent1
tasks:
- name: test set_fact
set_fact:
version: : {{ ansible_distribution }} - {{ ansible_distribution_version }}
- name: debug
debug:
msg: {{ version }}
# 测试结果如下(拼接完成)
TASK [debug] ***********************************************************************************
ok: [agent1] {
msg : RedHat - 8.2
④ 、lookup生成变量
1、[file]
可以将文件 主控端 的内容赋值给一个变量
{{ lookup( file , /root/.ssh/id_rsa.pub ) }}
2、[pipe]
可以将命令执行 主控端 的结果赋值给一个变量
{{ lookup( pipe , data %Y%m%d%H%M%S ) }}
3、[env]
可以获取主控端的环境变量
{{ lookup( env , HOSTNAME ) }}
4、测试
# playbook
[root master ansible]# cat lookup.yml
- hosts: agent1
vars:
key_ssh: {{ lookup( file , /root/.ssh/id_rsa.pub ) }}
date: {{ lookup( pipe , date %Y%m%d%H%M%S ) }}
env: {{ lookup( env , HOSTNAME ) }}
tasks:
- debug:
msg: {{ key_ssh }}
- debug:
msg: {{ date }}
- debug:
msg: {{ env }}
# 执行结果
[root master ansible]# ansible-playbook lookup.yml
PLAY [agent1] **********************************************************************************
TASK [Gathering Facts] *************************************************************************
ok: [agent1]
TASK [debug] ***********************************************************************************
ok: [agent1] {
msg : ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDsks4c6iusGmBwAVG9ui8iRW5mkvWmWcu59sZBvWWcg0q0d4pLGh44TWTAokh2KOXhu6ni59DTUlAf0CvXTQXbkIfWGEeHbsQpfO7qM67Jlot5ehgM2jPxtzT9ENmWabeMgWd8lqMz0iIg87q0cBitAZgh1yYuUSmccUqUF0mD6UOvsrsymFjBhsyqKmjpdO822fJ3KtBEoHIkd9dYcsCrH1hgFwb3nS0Oy7XoYJWUvQ1fXn V4R//jOioE8seI3r2hOB6AEi6no4hARutJTssckrWW7B2oXgbVFygwhL/t4RhUeYnv6o2ZXJHhT/dxbuaA1XW/ytzMRpCWW1iGCb/R/ilTUJ0BS22VnF82R50frHwmZ1nXny25LSacCezn RZCgg034aY9sqKvUuWiIPV1xDB3iXtY7SQo/8 TtX8d5xv95Hj8grAwgLn3zzYsQCU5qNECfHqBWAnuy4FgQD1 OeiF4M04XumuUSbqLlDqdaMYV8lDHcp 8lwARpjbrs root master
TASK [debug] ***********************************************************************************
ok: [agent1] {
msg : 20210614002841
TASK [debug] ***********************************************************************************
ok: [agent1] {
msg : master
PLAY RECAP *************************************************************************************
agent1 : ok 4 changed 0 unreachable 0 failed 0 skipped 0 rescued 0 ignored 0



