当前位置: 首页 > news >正文

day050-ansible剧本与变量

文章目录

  • 0. 老男孩思想-人性十大需求
  • 1. ansible playbook(剧本)
    • 1.1 ansible剧本基本格式
    • 1.2 编写测试剧本
    • 1.3 执行剧本
  • 2. ansible部署rsync服务
    • 2.1 更改文件行内容-lineinfile模块
    • 2.2 定时任务-cron模块
    • 2.3 编写rsync服务端剧本
    • 2.4 添加rsync服务端配置文件
    • 2.5 执行服务端剧本
    • 2.6 编写rsync客户端剧本
    • 2.7 添加备份脚本
    • 2.8 执行客户端剧本
  • 3. ansible批量创建用户
    • 3.1 编写剧本
    • 3.2 执行剧本
  • 4. ansible变量
  • 5. 分组变量
    • 5.1 变量文件命名规则
    • 5.2 分组变量的目录结构
    • 5.3 编写全局变量文件
    • 5.4 编写添加用户和创建目录剧本
    • 5.5 执行剧本并测试
  • 6. facts变量
    • 6.1 setup模块-收集主机信息
    • 6.2 常用facts变量
    • 6.3 debug模块
    • 6.4 编写剧本输出facts变量
    • 6.5 关闭facts获取主机信息功能
      • 6.5.1 彻底关闭facts
      • 6.5.2 临时关闭或启用facts
  • 7. template模块
    • 7.1 模块参数
    • 7.2 编写模版文件和测试剧本
    • 7.3 执行并测试结果
  • 8. register注册变量
    • 8.1 编写测试剧本
    • 8.2 执行
    • 8.3 修改测试剧本并测试
  • 9. 思维导图

0. 老男孩思想-人性十大需求

1.生理需求:生存、生活、性

2.物质需求:金钱、豪车、豪宅、艺术品……

3.健康需求:运动、饮食、心理健康……

4.情感(关系)需求:爱情、友情、亲情、朋友、兄弟、同学……

与他人交流,有了较近的关系,双方才会有较强的情感

5.尊重/认可需求:每个人都需要被他人尊重、认可,同时需要对别人有价值。因此对待长辈、领导、老板时,要有素养、礼貌,体现对方对于自己的重要性。

6.赞美和鼓励:当感受到他人的理解、支持或鼓励时,会更有动力,更有自信; 每一个成功的男人背后 ,都少不了一个默默支持他的妻子

7.成长需求:不断向上攀登、不断发展、不断提高精神境界的需求;人向高处走,向来如此。

8.形象需求:不仅仅是自身的形象,如自己的外貌、穿着打扮等;还有自己展现的形象,就是自己在别人心中的形象,如善良、勇敢、勇于承担等

9.自由需求:越努力越自由;人们不断的学习、努力工作,就是获得更多的机会、更多的物质条件,由此决定自己的选择,如去旅游、跳槽、做自己喜欢的事等。

10.好奇需求:与空心病(本质是价值观缺陷)相反,对新奇事物有着好奇心,有着活力。因为好奇,才有探索、创造的精神和自信。

1. ansible playbook(剧本)

1.1 ansible剧本基本格式

在这里插入图片描述

1.2 编写测试剧本

[root@m02 ~]# mkdir -p /server/ans/playbooks/
[root@m02 ~]# cd /server/ans/playbooks/
[root@m02 /server/ans/playbooks]# cat 01.test.yml 
- hosts: alltasks:- name: 01.打开冰箱门shell: echo 01.open >/tmp/lidao.txt- name: 02.大象放进去shell: echo 02.put >>/tmp/lidao.txt- name: 03.关门shell: echo 03.close >>/tmp/lidao.txt

1.3 执行剧本

[root@m02 /server/ans/playbooks]# ansible-playbook -i /etc/ansible/hosts 01.test.yml 
……# 明确要执行任务的客户机清单
PLAY [all] ******************************************************************************************************# 收集客户机的基本信息
TASK [Gathering Facts] ******************************************************************************************
ok: [172.16.1.9]
ok: [172.16.1.7]
ok: [172.16.1.8]
ok: [172.16.1.5]
ok: [172.16.1.6]
ok: [172.16.1.51]
ok: [172.16.1.31]
ok: [172.16.1.52]
ok: [172.16.1.41]
fatal: [172.16.1.10]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.10 port 22: No route to host", "unreachable": true}# 开始执行任务
TASK [01.打开冰箱门] ********************************************************************************************
changed: [172.16.1.9]
changed: [172.16.1.7]
changed: [172.16.1.5]
changed: [172.16.1.6]
changed: [172.16.1.8]
changed: [172.16.1.51]
changed: [172.16.1.52]
changed: [172.16.1.31]
changed: [172.16.1.41]TASK [02.大象放进去] ********************************************************************************************
changed: [172.16.1.5]
changed: [172.16.1.7]
changed: [172.16.1.9]
changed: [172.16.1.6]
changed: [172.16.1.8]
changed: [172.16.1.51]
changed: [172.16.1.52]
changed: [172.16.1.31]
changed: [172.16.1.41]TASK [03.关门] **************************************************************************************************
changed: [172.16.1.6]
changed: [172.16.1.5]
changed: [172.16.1.9]
changed: [172.16.1.7]
changed: [172.16.1.8]
changed: [172.16.1.51]
changed: [172.16.1.52]
changed: [172.16.1.31]
changed: [172.16.1.41]# 剧本执行结束,总结报告
PLAY RECAP ******************************************************************************************************
172.16.1.10                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.31                : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.41                : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.5                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.51                : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.52                : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.6                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.7                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.8                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.9                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

2. ansible部署rsync服务

2.1 更改文件行内容-lineinfile模块

  • 模块参数:
    • path:指定需要修改的客户机文件的路径
    • line:替换指定行的内容
    • create:如果文件不存在,是否创建文件(true/false(默认))
    • owner:指定文件的所有者
    • group:指定该文件的所属组
    • mode:指定文件的权限

2.2 定时任务-cron模块

  • 模块参数:
    • name:定时任务描述
    • job:要执行的命令或脚本
    • minute:分钟(0-59,默认为*)
    • hour:小时(0-23,默认为*)
    • day:日(1-31,默认为*)
    • month:月(1-12,默认为*)
    • weekday:周(0-7,周日=0或7,默认为*)

2.3 编写rsync服务端剧本

# 移动主机清单文件
[root@m02 /server/ans/playbooks]# mv /etc/ansible/hosts ./
[root@m02 /server/ans/playbooks]# cat 02.rsync_server.yaml 
#1.部署rsync服务端
- hosts: nfstasks:- name: 1.安装rsyncyum:name: rsyncstate: latest- name: 2.分发配置文件copy:src: ./files/rsyncd.confdest: /etc/rsyncd.confbackup: true- name: 3.添加用户user:name: rsyncshell: /sbin/nologincreate_home: falsestate: present- name: 4.创建备份目录,修改所有者file:path: /ans/backupmode: 0755owner: rsyncgroup: rsyncstate: directory- name: 5.创建密码文件,修改权限lineinfile:path: /etc/rsync.passwordline: "rsync_backup:1"mode: 0600owner: rootgroup: rootcreate: true- name: 6.启动服务systemd:name: rsyncdenabled: truestate: restarted
  • 使用vars剧本变量修改剧本
[root@m02 /server/ans/playbooks]# cat 02.rsync_server2.yaml
# 1.部署rsync服务端
- hosts: nfsvars:user: rsyncdir: /ans/backuptasks:- name: 1.安装rsyncyum:name: "{{ user }}"state: latest- name: 2.分发配置文件copy:src: ./files/rsyncd.confdest: /etc/rsyncd.confbackup: true- name: 3.添加用户user:name: "{{ user }}"shell: /sbin/nologincreate_home: falsestate: present- name: 4.创建备份目录,修改所有者file:path: "{{ dir }}"mode: 0755owner: "{{ user }}"group: "{{ user }}"state: directory- name: 5.创建密码文件,修改权限lineinfile:path: /etc/rsync.passwordline: "rsync_backup:1"mode: 0600owner: rootgroup: rootcreate: true- name: 6.启动服务systemd:name: rsyncdenabled: truestate: restarted

2.4 添加rsync服务端配置文件

[root@m02 /server/ans/playbooks]# mkdir files
[root@m02 /server/ans/playbooks]# cd files/
[root@m02 /server/ans/playbooks/files]# scp backup:/etc/rsyncd.conf ./
[root@m02 /server/ans/playbooks/files]# cat rsyncd.conf
#created by oldboy 15:01 2009-6-5
##rsyncd.conf start##
fake super = yes 
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[backup]
comment = www by old0boy 14:18 2012-1-13
path = /ans/backup

2.5 执行服务端剧本

[root@m02 /server/ans/playbooks]# ansible-playbook -i ./hosts 02.rsync_server.yaml 
……PLAY [nfs] ******************************************************************************************************TASK [Gathering Facts] ******************************************************************************************
ok: [172.16.1.31]TASK [1.安装rsync] **********************************************************************************************
changed: [172.16.1.31]TASK [2.分发配置文件] *******************************************************************************************
changed: [172.16.1.31]TASK [3.添加用户] ***********************************************************************************************
changed: [172.16.1.31]TASK [4.创建备份目录,修改所有者] ********************************************************************************
changed: [172.16.1.31]TASK [5.创建密码文件,修改权限] **********************************************************************************
changed: [172.16.1.31]TASK [6.启动服务] ***********************************************************************************************
changed: [172.16.1.31]PLAY RECAP ******************************************************************************************************
172.16.1.31                : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
  • 测试
[root@m02 /server/ans/playbooks]# rsync -avz ./hosts rsync_backup@nfs01::backup
Password: 
sending incremental file list
hostssent 174 bytes  received 43 bytes  39.45 bytes/sec
total size is 142  speedup is 0.65
#############################
[root@nfs01 ~]# ll /ans/backup/
总用量 4
-rw-r--r-- 1 rsync rsync 142  79 20:23 hosts

2.6 编写rsync客户端剧本

[root@m02 /server/ans/playbooks]# cat 02.rsync_client.yaml
# 2.部署rsync客户端
- hosts: alltasks:- name: 1.创建脚本存放目录file: path: /server/scriptsstate: directory- name: 2.分发脚本copy:src: ./files/rsync_backup.shdest: /server/scripts/rsync_backup.sh- name: 3.创建存放备份文件的目录file:path: /backupstate: directory- name: 4.创建用户密码文件lineinfile:path: /etc/rsync-client.passwordcreate: trueline: "1"owner: rootgroup: rootmode: 0600 - name: 5.定时任务(cron模块)cron:name: "定时备份任务"job: "/bin/bash /server/scripts/rsync_backup.sh"minute: 0hour: 23

2.7 添加备份脚本

[root@m02 /server/ans/playbooks/files]# scp nfs01:/server/scripts/rsync_backup.sh ./
……
[root@m02 /server/ans/playbooks/files]# cat rsync_backup.sh 
#!/bin/bash
##############################################################
# File Name:rsync_backup.sh
# Version:V1.0
# Author:SunKexu
# Organization:www.oldboyedu.com
# Desc:定时备份
##############################################################
export LANG=en_US.UTF-8
# vars
date=`date +%F_%w`
ip=`hostname -I |awk '{print $2}'`
bak_dir=/backup/
# vars rsync 服务端变量
user=rsync_backup
rsync_server_ip=172.16.1.41
module_name=backup
pass_file=/etc/rsync-client.password# 打包
function package(){# 确定压缩包存放目录[ ! -d "${bak_dir}${ip}" ] && mkdir -p "${bak_dir}${ip}"# 打包压缩tar zcf "${bak_dir}${ip}/etc-${date}.tar.gz" /etc/[ $? -eq 0 ] || {echo "tar failed"exit 1}
}
# rsync备份数据
function rsync_backup(){# rsync传输到服务器rsync -avz "${bak_dir}" "${user}@${rsync_server_ip}::${module_name}" --password-file=${pass_file}[ $? -eq 0 ] || {echo "rsync failed"exit 2}
}
# 清理旧的压缩包
function clean_tar(){# 清理旧的备份find $bak_dir -type f -name "*.tar.gz" -mtime +7 |xargs rm -f
}
# main函数
function main(){packagersync_backupclean_tar
}# command
main

2.8 执行客户端剧本

[root@m02 /server/ans/playbooks]# ansible-playbook -i ./hosts 02.rsync_client.yaml 
……PLAY [all] ******************************************************************************************************TASK [Gathering Facts] ******************************************************************************************
ok: [172.16.1.9]
ok: [172.16.1.5]
ok: [172.16.1.6]
ok: [172.16.1.7]
ok: [172.16.1.8]
ok: [172.16.1.41]
ok: [172.16.1.51]
ok: [172.16.1.52]
ok: [172.16.1.31]
fatal: [172.16.1.10]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.10 port 22: No route to host", "unreachable": true}TASK [1.创建脚本存放目录] ***************************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.6]
ok: [172.16.1.8]
ok: [172.16.1.9]
ok: [172.16.1.5]
ok: [172.16.1.51]
ok: [172.16.1.52]
ok: [172.16.1.41]
ok: [172.16.1.31]TASK [2.分发脚本] ***********************************************************************************************
ok: [172.16.1.6]
ok: [172.16.1.5]
ok: [172.16.1.7]
ok: [172.16.1.9]
ok: [172.16.1.8]
ok: [172.16.1.51]
ok: [172.16.1.52]
ok: [172.16.1.31]
ok: [172.16.1.41]TASK [3.创建存放备份文件的目录] *********************************************************************************
ok: [172.16.1.5]
ok: [172.16.1.6]
ok: [172.16.1.7]
ok: [172.16.1.8]
ok: [172.16.1.9]
ok: [172.16.1.51]
ok: [172.16.1.52]
ok: [172.16.1.31]
ok: [172.16.1.41]TASK [4.创建用户密码文件] ***************************************************************************************
ok: [172.16.1.8]
ok: [172.16.1.9]
ok: [172.16.1.6]
ok: [172.16.1.5]
ok: [172.16.1.7]
ok: [172.16.1.52]
ok: [172.16.1.31]
ok: [172.16.1.51]
ok: [172.16.1.41]TASK [5.定时任务(cron模块)] *************************************************************************************
changed: [172.16.1.6]
changed: [172.16.1.9]
changed: [172.16.1.5]
changed: [172.16.1.7]
changed: [172.16.1.8]
changed: [172.16.1.51]
changed: [172.16.1.31]
changed: [172.16.1.52]
changed: [172.16.1.41]PLAY RECAP ******************************************************************************************************
172.16.1.10                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.31                : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.41                : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.5                 : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.51                : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.52                : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.6                 : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.7                 : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.8                 : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.9                 : ok=6    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 检查
[root@m02 ~]# ansible -i /server/ans/playbooks/hosts all -m shell -a 'crontab -l'
……
172.16.1.5 | CHANGED | rc=0 >>
#1. sync time by lidao996 at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
#Ansible: 定时备份任务
0 23 * * * /bin/bash /server/scripts/rsync_backup.sh
172.16.1.6 | CHANGED | rc=0 >>
#1. sync time by lidao996 at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
#Ansible: 定时备份任务
0 23 * * * /bin/bash /server/scripts/rsync_backup.sh
……

3. ansible批量创建用户

3.1 编写剧本

[root@m02 /server/ans/playbooks]# cat 03.add_user.yaml
- hosts: allvars: # 定义剧本变量password: "SKX2554."tasks:- name: "1.创建用户"user:name: oldboypassword: "{{ password|password_hash('sha512','skx') }}" # 引用变量和执行函数;对密码加密并加盐state: present

3.2 执行剧本

[root@m02 /server/ans/playbooks]# ansible-playbook -i ./hosts 03.add_user.yaml 
……PLAY [all] ******************************************************************************************************TASK [Gathering Facts] ******************************************************************************************
ok: [172.16.1.5]
ok: [172.16.1.6]
ok: [172.16.1.9]
ok: [172.16.1.8]
ok: [172.16.1.7]
ok: [172.16.1.41]
ok: [172.16.1.51]
ok: [172.16.1.31]
ok: [172.16.1.52]
fatal: [172.16.1.10]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.16.1.10 port 22: No route to host", "unreachable": true}TASK [1.创建用户] ***********************************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.9]
changed: [172.16.1.6]
changed: [172.16.1.5]
changed: [172.16.1.8]
changed: [172.16.1.31]
changed: [172.16.1.51]
changed: [172.16.1.52]
changed: [172.16.1.41]PLAY RECAP ******************************************************************************************************
172.16.1.10                : ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.31                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.41                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.5                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.51                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.52                : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.6                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.7                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.8                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
172.16.1.9                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

4. ansible变量

按定义区域不同分类说明
剧本变量vars,仅限当前play使用
独立文件中定义(变量文件)把变量写入到文件中,通过vars_files调取;
play中指定变量文件
分组变量group_vars,推荐使用,根据分组自动调用;
facts变量剧本运行是默认收集信息,可以创建指定的变量;
如果不用,建议关闭
register变量捕获任务的输出结果,并将这些结果存储在变量中,供后续任务使用
主机清单变量为特定主机或主机组分配变量的方式,使Playbook能针对不同环境
(如开发、测试、生产)动态调整配置

5. 分组变量

group_vars 是一种专门用于为 主机组(Inventory Groups) 定义变量的机制,它允许你集中管理同一组主机的共享配置,从而实现配置的模块化和环境差异化部署。

5.1 变量文件命名规则

文件命名方式作用范围示例
all.yaml作用于所有组(全局变量)all.yaml
与组同名仅作用于指定组web.yaml、nfs.yaml
按子组命名仅作用于嵌套子组data.yaml

5.2 分组变量的目录结构

[root@m02 /server/ans/playbooks]# tree group_vars/
group_vars/
├── all.yaml
├── data.yaml
├── lb.yaml
├── nfs.yaml
└── web.yaml0 directories, 5 files

5.3 编写全局变量文件

[root@m02 /server/ans/playbooks]# cat group_vars/all.yaml
user: skx
dir: /backup/test

5.4 编写添加用户和创建目录剧本

[root@m02 /server/ans/playbooks]# cat 03.add_user2.yaml
- hosts: alltasks:- name: "1.添加用户"user:name: "{{ user }}"shell: /sbin/nologincreate_home: falsestate: present- name: "2.创建目录"file:path: "{{ dir }}"owner: "{{ user }}"group: "{{ user }}"mode: 0755state: directory

5.5 执行剧本并测试

[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 03.add_user2.yaml 
……
# 测试
[root@m02 /server/ans/playbooks]# ansible -i hosts all -m shell -a 'ls -ld /backup/test'
……
172.16.1.7 | CHANGED | rc=0 >>
drwxr-xr-x 2 skx skx 6  710 21:51 /backup/test
172.16.1.9 | CHANGED | rc=0 >>
drwxr-xr-x 2 skx skx 6  710 21:51 /backup/test
172.16.1.5 | CHANGED | rc=0 >>
drwxr-xr-x 2 skx skx 6  710 21:51 /backup/test
……

6. facts变量

facts 是目标主机的系统信息(如 CPU、内存、IP、OS 等),由 setup 模块自动收集。这些 facts 可以作为变量在 Playbook 或 Ad-Hoc 命令中使用。

6.1 setup模块-收集主机信息

[root@m02 /server/ans/playbooks]# ansible -i hosts 172.16.1.7 -m setup
……
172.16.1.7 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["10.0.0.7","172.16.1.7"],"ansible_all_ipv6_addresses": ["fe80::fd3c:da1b:b64b:41f0","fe80::5b66:ba41:1143:ad88","fe80::3d14:45b8:d3a3:ff00","fe80::a196:d8ba:54bd:ba15","fe80::4ee7:f22c:bfc0:d6df","fe80::4135:8926:62b8:97c5"],"ansible_apparmor": {"status": "disabled"},"ansible_architecture": "x86_64","ansible_bios_date": "11/12/2020","ansible_bios_vendor": "Phoenix Technologies LTD","ansible_bios_version": "6.00","ansible_board_asset_tag": "NA","ansible_board_name": "440BX Desktop Reference Platform","ansible_board_serial": "None","ansible_board_vendor": "Intel Corporation","ansible_board_version": "None","ansible_chassis_asset_tag": "No Asset Tag","ansible_chassis_serial": "None","ansible_chassis_vendor": "No Enclosure","ansible_chassis_version": "N/A","ansible_cmdline": {"BOOT_IMAGE": "/vmlinuz-4.19.90-52.22.v2207.ky10.x86_64","audit": "0","quiet": true,"rd.lvm.lv": "klas/root","resume": "UUID=1d3e0429-5c9c-4f52-9f5f-133ffbb0e75f","rhgb": true,"ro": true,"root": "/dev/mapper/klas-root"},"ansible_date_time": {"date": "2025-07-11","day": "11","epoch": "1752199418","hour": "10","iso8601": "2025-07-11T02:03:38Z","iso8601_basic": "20250711T100338320197","iso8601_basic_short": "20250711T100338","iso8601_micro": "2025-07-11T02:03:38.320197Z","minute": "03","month": "07","second": "38","time": "10:03:38","tz": "CST","tz_dst": "CST","tz_offset": "+0800","weekday": "星期五","weekday_number": "5","weeknumber": "27","year": "2025"},"ansible_default_ipv4": {"address": "10.0.0.7","alias": "ens33","broadcast": "10.0.0.255","gateway": "10.0.0.2","interface": "ens33","macaddress": "00:0c:29:66:56:96","mtu": 1500,"netmask": "255.255.255.0","network": "10.0.0.0","type": "ether"},
……

6.2 常用facts变量

主机名: {{ ansible_hostname }}
ip: {{ ansible_all_ipv4_addresses }}
内存总大小: {{ ansible_memtotal_mb }}
系统发行版本: {{ ansible_distribution }}
系统版本: {{ ansible_distribution_major_version }}
cpu架构: {{ ansible_architecture }}
系统版本昵称: {{ ansible_distribution_release }}1块网卡的ip地址: {{ ansible_default_ipv4.address }}

6.3 debug模块

debug 模块 用于调试 Playbook,可以打印变量、消息或 facts,方便排查问题。

  • 模块参数:
    • msg:打印自定义消息(字符串),和变量(需加上{{ }})
    • vars:打印变量,不用加{{ }}

6.4 编写剧本输出facts变量

[root@m02 /server/ans/playbooks]# cat 04.facts_vars.yaml 
- hosts: alltasks:- name: 1.测试输出facts变量debug:msg: | # 加管道符,表示多行输出主机名: {{ ansible_hostname }}ip: {{ ansible_all_ipv4_addresses }}内存总大小: {{ ansible_memtotal_mb }}系统发行版本: {{ ansible_distribution }}系统版本: {{ ansible_distribution_major_version }}cpu架构: {{ ansible_architecture }}系统版本昵称: {{ ansible_distribution_release }}第1块网卡的ip地址: {{ ansible_default_ipv4.address }}
  • 执行结果:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts  04.facts_vars.yaml 
……
TASK [1.测试输出facts变量] **************************************************************************************
ok: [172.16.1.7] => {"msg": "主机名: web01\nip: ['10.0.0.7', '172.16.1.7']\n内存总大小: 1956\n系统发行版本: Kylin Linux Advanced Server\n系统版本: V10\ncpu架构: x86_64\n系统版本昵称: Lance\n第1块网卡的ip地址: 10.0.0.7\n"
}
ok: [172.16.1.8] => {"msg": "主机名: web02\nip: ['172.16.1.8', '10.0.0.8']\n内存总大小: 1956\n系统发行版本: Kylin Linux Advanced Server\n系统版本: V10\ncpu架构: x86_64\n系统版本昵称: Lance\n第1块网卡的ip地址: 10.0.0.8\n"
}
ok: [172.16.1.9] => {"msg": "主机名: web03\nip: ['172.16.1.9', '10.0.0.9']\n内存总大小: 1956\n系统发行版本: Kylin Linux Advanced Server\n系统版本: V10\ncpu架构: x86_64\n系统版本昵称: Lance\n第1块网卡的ip地址: 10.0.0.9\n"
}
……

6.5 关闭facts获取主机信息功能

6.5.1 彻底关闭facts

  • 修改ansible的配置文件:/etc/ansible/ansible.cfg,添加关闭facts的参数:
[root@m02 /server/ans/playbooks]# cat /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python=/usr/bin/python3
gathering = explicit # 彻底关闭facts功能
……

6.5.2 临时关闭或启用facts

  • 在剧本中添加选项:
    • gather_facts:针对当前剧本设置facts功能
      • true:表示启动facts
      • false:表示关闭facts

7. template模块

template模块结合了 Jinja2 模板引擎的功能,可以动态生成配置文件,文件后缀名是.j2;
文件中变量只能是ansible变量

7.1 模块参数

  • src:本地jinja2模本文件路径
  • dest:客户机文件路径
  • owner:文件所有者
  • group:文件所属组
  • mode:文件权限
  • backup:如果客户机上有目标文件,是否要备份(true/false(默认))

7.2 编写模版文件和测试剧本

  • jinja2模板文件,只能是.j2为后缀名:
[root@m02 /server/ans/playbooks/files]# cat motd.j2
主机名: {{ ansible_hostname }}
ip: {{ ansible_all_ipv4_addresses }}
内存总大小: {{ ansible_memtotal_mb }}
系统发行版本: {{ ansible_distribution }}
系统版本: {{ ansible_distribution_major_version }}
cpu架构: {{ ansible_architecture }}
系统版本昵称: {{ ansible_distribution_release }}
第1块网卡的ip地址: {{ ansible_default_ipv4.address }}
  • 分发动态配置文件剧本:
[root@m02 /server/ans/playbooks]# cat 05.template_test.yaml 
- hosts: alltasks:- name: 1.分发动态配置文件template:src: ./files/motd.j2dest: /etc/motdbackup: true

7.3 执行并测试结果

[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 05.template_test.yaml 
……

在这里插入图片描述

8. register注册变量

register 用于将任务(task)的输出保存到变量中,可以捕获命令结果、模块返回值或错误信息,并在 Playbook 中动态处理。

8.1 编写测试剧本

[root@m02 /server/ans/playbooks]# cat 06.register_test.yaml 
- hosts: alltasks:- name: 1.查看主机ipshell: hostname -Iregister: ip- name: 2.输出变量值debug:vars: ip

8.2 执行

[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 06.register_test.yaml 
……TASK [1.查看主机ip] *********************************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]
changed: [172.16.1.9]TASK [2.输出变量值] *********************************************************************************************
ok: [172.16.1.7] => {"msg": {"changed": true,"cmd": "hostname -I","delta": "0:00:00.003911","end": "2025-07-11 14:44:49.604903","failed": false,"msg": "","rc": 0,"start": "2025-07-11 14:44:49.600992","stderr": "","stderr_lines": [],"stdout": "10.0.0.7 172.16.1.7 ","stdout_lines": ["10.0.0.7 172.16.1.7 "]}
}
……
  • 根据结果可见ansible中命令的返回值并不是单一的命令结果,而包含着其他信息;返回类型为json格式
    • 而命令的结果存放在stdout和stderr中

8.3 修改测试剧本并测试

[root@m02 /server/ans/playbooks]# cat 06.register_test.yaml 
- hosts: alltasks:- name: 1.查看主机ipshell: hostname -Iregister: ip- name: 2.输出变量值debug:msg: |stdout: "{{ ip.stdout }}"stderr: "{{ ip.stderr }}"
  • 测试:
[root@m02 /server/ans/playbooks]# ansible-playbook -i hosts 06.register_test.yaml 
……TASK [1.查看主机ip] *********************************************************************************************
changed: [172.16.1.8]
changed: [172.16.1.9]
changed: [172.16.1.7]TASK [2.输出变量值] *********************************************************************************************
ok: [172.16.1.7] => {"msg": "stdout: \"10.0.0.7 172.16.1.7 \"\nstderr: \"\"\n"
}
ok: [172.16.1.8] => {"msg": "stdout: \"10.0.0.8 172.16.1.8 \"\nstderr: \"\"\n"
}
ok: [172.16.1.9] => {"msg": "stdout: \"10.0.0.9 172.16.1.9 \"\nstderr: \"\"\n"
}
……

9. 思维导图

https://kdocs.cn/join/gpuxq6r?f=101\r\n邀请你加入共享群「老男孩教育Linux运维99期-孙克旭」一起进行文档协作

http://www.dtcms.com/a/274371.html

相关文章:

  • 云暴露面分析完整指南
  • 2025年7月11日—基础算法—高精度
  • 删除mysql文件夹时显示在另一程序中打开
  • 期权交易完整版教程简介
  • 工具分享--IP与域名提取工具
  • YOLOv13来了!基于超图增强的自适应视觉感知实时目标检测
  • 数据结构第一章复杂度的认识
  • WebSocket 重连与心跳机制:打造坚如磐石的实时连接
  • 005---Xilinx Viivado FIFO (二)---fifo IP核使用总结
  • python之set详谈
  • 大数据驱动的酒店用品需求预测模型研究 开发——毕业论文,毕业设计——仙盟创梦IDE
  • Linux驱动基本概念(内核态、用户态、模块、加载、卸载、设备注册、字符设备)
  • linux文件系统目录结构以及交互界面
  • 稳定币将成为新时代的重要金融工具
  • Pandas:数据类型转换
  • c99-柔性数组
  • NVME在ubuntu上总是导致死机
  • Android simpleperf生成火焰图
  • 深度解析 DApp 开发:从技术架构到商业落地的全链路解决
  • Linux 进程管理核心机制
  • 掌握Spring声明式事务传播机制:AOP与ThreadLocal的协同工作
  • 破解异构日志清洗五大难题,全面提升运维数据可观测性
  • 用FunctionCall实现文件解析(一):环境准备与基础知识
  • uniapp语音播报天气预报微信小程序
  • 秒杀系统该怎么设计?
  • uniapp-在windows上IOS真机运行(含开发证书申请流程)
  • 在Spring Boot 开发中 Bean 的声明和依赖注入最佳的组合方式是什么?
  • Spring Boot集成Redis:从配置到实战的完整指南
  • Adobe Acrobat DC JavaScript 基础到应用
  • python的卷烟营销数据统计分析系统