day050-ansible剧本与变量

发布于:2025-07-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

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: all
  tasks:
    - 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: nfs
  tasks:
    - name: 1.安装rsync
      yum:
        name: rsync
        state: latest

    - name: 2.分发配置文件
      copy:
        src: ./files/rsyncd.conf
        dest: /etc/rsyncd.conf
        backup: true

    - name: 3.添加用户
      user:
        name: rsync
        shell: /sbin/nologin
        create_home: false
        state: present

    - name: 4.创建备份目录,修改所有者
      file:
        path: /ans/backup
        mode: 0755
        owner: rsync
        group: rsync
        state: directory

    - name: 5.创建密码文件,修改权限
      lineinfile:
        path: /etc/rsync.password
        line: "rsync_backup:1"
        mode: 0600
        owner: root
        group: root
        create: true
  
    - name: 6.启动服务
      systemd:
        name: rsyncd
        enabled: true
        state: restarted

  • 使用vars剧本变量修改剧本
[root@m02 /server/ans/playbooks]# cat 02.rsync_server2.yaml
# 1.部署rsync服务端
- hosts: nfs
  vars:
    user: rsync
    dir: /ans/backup
  tasks:
    - name: 1.安装rsync
      yum:
        name: "{{ user }}"
        state: latest

    - name: 2.分发配置文件
      copy:
        src: ./files/rsyncd.conf
        dest: /etc/rsyncd.conf
        backup: true

    - name: 3.添加用户
      user:
        name: "{{ user }}"
        shell: /sbin/nologin
        create_home: false
        state: present

    - name: 4.创建备份目录,修改所有者
      file:
        path: "{{ dir }}"
        mode: 0755
        owner: "{{ user }}"
        group: "{{ user }}"
        state: directory

    - name: 5.创建密码文件,修改权限
      lineinfile:
        path: /etc/rsync.password
        line: "rsync_backup:1"
        mode: 0600
        owner: root
        group: root
        create: true
  
    - name: 6.启动服务
      systemd:
        name: rsyncd
        enabled: true
        state: 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
hosts

sent 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: all
  tasks:
    - name: 1.创建脚本存放目录
      file: 
        path: /server/scripts
        state: directory

    - name: 2.分发脚本
      copy:
        src: ./files/rsync_backup.sh
        dest: /server/scripts/rsync_backup.sh
  
    - name: 3.创建存放备份文件的目录
      file:
        path: /backup
        state: directory

    - name: 4.创建用户密码文件
      lineinfile:
        path: /etc/rsync-client.password
        create: true
        line: "1"
        owner: root
        group: root
        mode: 0600 

    - name: 5.定时任务(cron模块)
      cron:
        name: "定时备份任务"
        job: "/bin/bash /server/scripts/rsync_backup.sh"
        minute: 0
        hour: 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(){
	package
	rsync_backup
	clean_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: all
  vars: # 定义剧本变量
    password: "SKX2554."
  tasks:
    - name: "1.创建用户"
      user:
        name: oldboy
        password: "{{ 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.yaml

0 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: all
  tasks:
    - name: "1.添加用户"
      user:
        name: "{{ user }}"
        shell: /sbin/nologin
        create_home: false
        state: present

    - name: "2.创建目录"
      file:
        path: "{{ dir }}"
        owner: "{{ user }}"
        group: "{{ user }}"
        mode: 0755
        state: 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: all
  tasks:
    - 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: all
  tasks:
    - name: 1.分发动态配置文件
      template:
        src: ./files/motd.j2
        dest: /etc/motd
        backup: 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: all
  tasks:
    - name: 1.查看主机ip
      shell: hostname -I
      register: 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: all
  tasks:
    - name: 1.查看主机ip
      shell: hostname -I
      register: 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期-孙克旭」一起进行文档协作


网站公告

今日签到

点亮在社区的每一天
去签到