杨梅冲
每天在想什么呢?

一、剧本

playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量,剧本中存放的时候?模块
剧本yaml格式,yaml格式的文件:空格,冒号.
剧本未来我们批量管理,运维必会的内容.

1.1 剧本格式

image

 

# 查看yaml格式语法是否正确
ansible-playbook --syntax-check show.yaml 

playbook: show.yaml

#1 . 书写剧本注意以.yml或.yaml结尾
#2 . 执行剧本
ansible-playbook -i hosts 01.show.yml

# cat 01.show.yml
- hosts: all 
  tasks:
  - name: 01 打开冰箱门
    shell: echo 01 /tmp/bingxiang.log
  - name: 02 把大象放入冰箱
    shell: echo 02 /tmp/bingxiang.log
  - name: 03 关上冰箱的门
    shell: echo 03 /tmp/bingxiang.log

$ ansible-playbook show.yaml 
PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [01 打开冰箱门] *********************************************************************************************************************
changed: [172.31.0.1]
TASK [02 把大象放入冰箱] *****************************************************************************************************************
changed: [172.31.0.1]
TASK [03 关上冰箱的门] *******************************************************************************************************************
changed: [172.31.0.1]
PLAY RECAP *******************************************************************************************************************************
172.31.0.1              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

# 执行的时候如果有奶牛:🐮
# 可以删除软件或修改ansible.cfg配置进行关闭  #nocows = 1去掉注释即可

二、剧本案例

--syntax-check‌ 是‌语法检查‌:只检查 YAML 格式和 Ansible 关键字是否正确

  ansible-playbook --syntax-check nfs.yaml

2.1 ansible-playbook常用参数

参数 简写 说明 示例
‌--inventory -i 指定主机清单文件(Inventory)。如果不指定,默认使用 /etc/ansible/hosts ansible-playbook -i hosts.ini site.yml
‌--limit -l 限制执行的主机范围。可以指定主机名、IP 或组名。 ansible-playbook -l web_servers site.yml
--user -u 指定远程连接的用户名。 ansible-playbook -u admin site.yml
--become -b 提权执行(相当于 sudo)。通常在 Playbook 中未设置 become: yes 时使用。 ansible-playbook -b site.yml
‌--ask-become-pass -K 提示输入 sudo 密码。当远程用户需要密码提权时使用。 ansible-playbook -b -K site.yml
‌--check -C ‌干跑模式‌。只检查会做什么改变,不实际执行修改。用于测试 ansible-playbook -C site.yml
‌--diff   显示文件变化的差异详情。常与 -C 配合使用。 ansible-playbook -C --diff site.yml
‌--verbose -v 显示详细输出。-vvv 显示调试信息,-vvvv 显示连接调试信息 ansible-playbook -v site.yml
‌--tags -t 只执行带有特定标签的任务 ansible-playbook -t install,config site.yml
--skip-tags   跳过带有特定标签的任务。 ansible-playbook --skip-tags debug site.yml
‌--extra-vars -e 传入额外变量,优先级最高。支持 JSON 格式或键值对。 ansible-playbook -e "http_port=8080" site.yml

 

# 案例01: 创建目录并分发文件
步骤:
1 . 创建目录/server/files/
2 . /etc/hosts文件发送过去/server/files/

# 中间转换
# 1.创建目录/server/files/
-m file  -a 'path=/server/files/  state=directory'
# 2.分发
-m copy -a 'src=/etc/hosts dest=/server/files/ 

# 剧本编写
cat dist_file.yml
- hosts: all 
  tasks:
  - name: 01 创建目录
    file: ptah =/data/files/  stae=directory
  - name: 02 分发文件
    copy: scr =/etc/hosts dst =/data/files/


# 专业格式的剧本,修改所属
- hosts: all
  tasks:
  - name: 01 创建目录
    file:
      path: /data/files/
      state: directory
      owner: ec2-user
      group: ec2-user

  - name: 02 分发文件
    copy:
      src: /etc/hosts
      dest: /data/files/
      owner: ec2-user
      group: ec2-user

案例2:

# 案例: 分发软件包,安装软件包,启动服务
步骤:
 1.zabbix-agent软件包(下载)
 2.安装软件包
 3.配置(略)
 4.启动开机自启动

# 第一个里程碑:找出每个步骤的命令
1.下载软件包
wget https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/8.0/release/amazonlinux/2023/noarch/zabbix-release-latest.amzn2023.noarch.rpm
2.安装软件包
yum install -y zabbix-agent-6 .0 .7-1 .el7.x86 _64 .rpm
3.配置略
4.启动
    systemctl

# 第2个里程碑-把上面步骤与命令找出对应的ans的模块
1.下载软件包:get_url
2.安装:yum
3.略
4.启动:systemd

# 第3个里程碑:书写剧本
- hosts: monitor
  tasks:
  - name: 01. 下载软件包/tmp/
    get_url:
      url: "https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/8.0/release/amazonlinux/2023/noarch/zabbix-release-latest.amzn2023.noarch.rpm"
      validate_certs: no # 是否启用ssl证书,默认yes
      dest: /tmp/
  - name: 02. 安装软件包
    yum:
      name: /tmp/zabbix-release-latest.amzn2023.noarch.rpm
      state: present
      disable_gpg_check: no  # 包管理模块校验签名
  - name: 03. 配置
    debug:
      msg: "进行配置zabbix-agent"
  - name: 04. 启动
    systemd:
      name: zabbix-agent

案例:nfs服务

# 要求
nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名户:nfsnobody
nfs客户端:web挂载/ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)


步骤:
第1个里程碑-列出流程
服务端流程:
1. 部署nfs-utils,rpcbind
2. 修改配置文件
3. 创建共享目录并改所有者
4. 启动服务rpcbind,nfs(注意顺序)

客户端流程:
1. 安装nfs-utils
2. 挂载与永久挂载

第2个里程碑-根据步骤流程模块


第3个里程碑-书写剧本
服务端流程:
1. 部署nfs-utils
2. 修改配置文件/etc/exports
   /backup-nfs 172.16.1.0/24(rw,all_squash)
3. 创建共享目录,改所有者
4.启动服务rpcbind,nfs

客户端:
1.安装nfs-utils
2.挂载与永久挂载
# nfs.yaml
- hosts: backup
  tasks:
  - name: 01 . 部署nfs-utils,rpcbind
    yum:
      name: nfs-utils,rpcbind
      state: present
  - name: 02 . 修改配置文件
    lineinfile:
      path: /etc/exports
      line: "/backup-nfs 172.16.1.0/24(rw,all_squash)"
      create: true
  - name: 03 . 创建共享目录并改所有者
    file:
      path: /backup-nfs
      owner: ec2-user
      group: ec2-user
      state: directory
  - name: 04 -1. 启动服务rpcbind,nfs(注意顺序)
    systemd:
      name: rpcbind
      enabled: yes
      state: started
  - name: 04 -2. 启动服务rpcbind,nfs(注意顺序)
    systemd:
      name: nfs
      enabled: yes
      state: started
#nfs客户端部署
- hosts: web
  tasks:
    - name: 01 . 部署nfs-utils
      yum:
        name: nfs-utils
        state: present
    - name: 02 . 挂载nfs
      mount:
        src: 172.16.1.41:/backup-nfs
        path: /ans-upload
        fstype: nfs
        state: mounted

# /etc/fstab
172.16.1.41:/backup-nfs /ans-upload/ nfs defaults 0 0

 三、变量

变量无处不在,在ans中大部分地方都可以定义变量.

比较常用的创建变量的地方:剧本中,类似于 功能,共用的变量文件.

3.1 剧本中使用变量

# vars : variable 变量的内容,变量.
# dir就是变量,变量的内容:右边的内容. 
# 举例:批量创建目录/data/files

- hosts: ywmonitor
  vars:
    dir: /data/files  # 变量
  tasks:
    - name: 创建目录
      file:
        path: "{{ dir }}"  # 如果直接是变量需要加引号,如果不是以变量开头就不需要引号,例如:/ss/{{dir}}/ss
        state: directory


在剧本play中定义变量应用:
1. 仅仅在当前play生效.
2. 一般用来存放路径,用户名,ip地址,类似于之前使用的脚本.
3. 注意引号使用.

3.2 共用变量:变量文件

# 在同一目录下创建变量文件vars.yml
#cat vars.yml 
user: ec2-user
group: ec2-user
dir: /data
file: test.txt

# 编写剧本
# cat test_vars.yml 
- hosts: ywmonitor
  vars_files: ./vars.yml
  tasks:
    - name: file
      file:
        path: "{{ dir}}/{{file}}"
        state: touch
        owner: "{{ user }}"
        group: "{{group}}"
    - name: select
      debug:
        msg: "vars: {{dir}}-{{file}}-{{user}}-{{file}}"

# 结果:
# ansible-playbook test_vars.yml 
PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [file] ******************************************************************************************************************************
changed: [172.31.0.1]
TASK [select] ****************************************************************************************************************************
ok: [172.31.0.1] => {
    "msg": "vars: /data-test.txt-ec2-user-test.txt"
}
PLAY RECAP *******************************************************************************************************************************
172.31.0.1              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

3.2.2 共用变量根据主机组使用变量

xxxx-check.yml 
group_vars/
    lb/vars.yml  #存放lb组的变量
    web/vars.yml #存放web组的变量
    data/vars.yml #存放xxx组的变量
    all/vars.yml  #所有主机共用的变量
未来一般使用all分组即可,把所有变量存放在一起,供剧本使用.
# 创建变量vars.yaml存放地址
mkdir group_vars/all/vars.yml
# cat group_vars/all/vars.yml 
user: ec2-user
group: ec2-user
dir: /data
file: test1.txt

# 剧本
# cat groupvar.yaml 
- hosts: gw
  tasks:
    - name: " 测试变量内容"
      debug:
        msg: "{{user}}-{{group}}"

- hosts: ywmonitor
  tasks:
    - name: "单独测试组是否识别"
      debug:
        msg: "{{user}}-{{group}}-{{file}}"

# 执行结果显示:
"msg": "ec2-user-ec2-user"
"msg": "ec2-user-ec2-user-test1.txt"
# 如果是gw单独的变量分开来了,那只能gw组可以使用,其余组使用不了
vim group_vars/gw/vars.yml
lbs: test.xc.com
test: test

# groupvars.yml
- hosts: gw
  tasks:
    - name: " 测试变量内容"
      debug:
        msg: "{{lbs}}-{{test}}"

- hosts: ywmonitor
  tasks:
    - name: "单独测试组是否识别"
      debug:
        msg: "{{user}}-{{group}}-{{file}}"

3.3 register变量 注册变量

  本质上就是用来实现脚本中的 反引号功能 ip=`hostname -I`

  用户通过命令获取的内容都存放到Register变量中.

# register.yml
- hosts: ywmonitor
  tasks:
  - name: get date 
    shell: date +%F
    register: result
  - name: print result 变量内容
    debug:
      msg: |
        "register变量的全部内容是:{{result}}"
        "register变量的全部内容是:{{result.stdout}}"
# msg的竖线: | 表示下面是多行的
# 执行结果ansible-playbook register.yml

PLAY [ywmonitor] *************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************
ok: [172.31.0.1]
TASK [get date] **************************************************************************************************************************
changed: [172.31.0.1]
TASK [print result 变量内容] *************************************************************************************************************
ok: [172.31.0.1] => {
    "msg": "\"register变量的全部内容是:{'changed': True, 'stdout': '2026-05-16', 'stderr': '', 'rc': 0, 'cmd': 'date +%F', 'start': '2026-05-16 19:09:11.905330', 'end': '2026-05-16 19:09:11.908919', 'delta': '0:00:00.003589', 'msg': '', 'stdout_lines': ['2026-05-16'], 'stderr_lines': [], 'failed': False}\"\n\"register变量的全部内容是:2026-05-16\"\n"
}

PLAY RECAP *******************************************************************************************************************************
172.31.0.1              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

register注册变量:
变量.stdout 获取输出即可.
result是json形式数据. key: value 键: 值 变量: 内容 date +%F stdout部分是我们想要的内容. register变量result . result.stdout #std standard output 标准输出.

 

3.4 facts 变量 与 Jinja2模板

  运行剧本的时候ans会收集每个主机的基本信息,这些信息形成的变量叫做facts变量.

  facts变量setup模块获取

 

template模块与xxx .j2文件

  应用场景:

    1.进行分发配置文件或文件的时候,需要在文件中使用变量,需要使用jinja2文件 nginx .conf .j2,需要使用template模块进行分发.

    2.进行判断

常用fact变量
ansible_hostname   #主机名
 ansible_memtotal_mb #内存大小(总计) 单位mb
ansible_processor_vcpus #cpu数量

ansible_default_ipv4 .address  #默认的网卡ip eth0
ansible_distribution #系统发行版本名字
    CentOS  Ubuntu  Debian 

ansible_processor_vcpus
ansible_processor_cores
ansible_date_time .date

找一台机器可以看到全部信息:ansible 172.31.0.1 -m setup
# 1.批量修改系统/etc/motd文件,登录的时候输出系统的基本信息.
 输出主机名
 输出内存总大小
 输出ip地址
 发行版本
 cpu数
 核心数
# templates/motd.j2内容
# cat templates/motd.j2 
welcome to oldboy elastic linux system操作需谨慎,删根弹指间.
主机名: {{ ansible_hostname }}
ip地址: {{ ansible_default_ipv4 .address }} # 根据缩进来获取信息
内存大小: {{ ansible_memtotal_mb }}

CPU数量: {{ ansible_processor_vcpus }}
核心总数: {{ ansible_processor_cores }}
发行版本: {{ ansible_distribution }}

# motd.yml剧本编写
- hosts: ywmonitor
# gather_facts: no # 关闭配置:关闭自动收集 tasks: - name: "分发 motd 文件" template: src: templates/motd.j2 dest: /etc/motd backup: yes - name: "验证 motd 内容" command: cat /etc/motd register: motd_content changed_when: false # 标记为不改变状态,避免影响幂等性判断 - name: "显示 motd 内容" debug: var: motd_content.stdout_lines # 结果内容: PLAY [ywmonitor] ************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************* ok: [172.31.0.1] TASK [分发 motd 文件] ******************************************************************************************************************** ok: [172.31.0.1] TASK [验证 motd 内容] ******************************************************************************************************************** ok: [172.31.0.1] TASK [显示 motd 内容] ******************************************************************************************************************** ok: [172.31.0.1] => { "motd_content.stdout_lines": [ "welcome to test elastic linux system操作需谨慎,删根弹指间.", "主机名: monitor", "ip地址: 172.31.0.1", "内存大小: 7739", "", "CPU数量: 4", "核心总数: 2", "发行版本: Amazon" ] } PLAY RECAP ******************************************************************************************************************************* 172.31.0.1 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 温馨提示: template vs copy模块
copy仅仅传输数据,复制文件.
template 传输数据,复制文件的时候,文件中的变量会被解析和运行.
- hosts: all 
  gather_facts: no
  tasks:
    - name: 分发motd文件
      template:
        src: templates/motd.j2
        dest: /etc/motd
        backup: yes
    - name: 分发motd文件
      copy:
        src: templates/motd.j2
        dest: /tmp/motd
        backup: yes
copy与template对比剧本

关于facts变量实际应用案例:
1. 通过facts变量获取系统的基本信息
2. 通过facts变量获取信息并进行判断
3. 如果不需要可以进行关闭,加速剧本的运行( gather_facts: no)

 判断使用:

# 2.根据主机名或ip或其他条件,生成不同的配置文件
 /tmp/keepalived.conf
lb01
lb02

配置文件内容
/tmp/keepalived.conf
web01 配置文件内容
state MASTER

/tmp/keepalived.conf
backup 配置文件内容
state BACKUP

- hosts: all 
  tasks:
    - name: 分发配置文件
      template:
        src: templates/keepalived.conf.j2
        dest: /tmp/keepalived.conf

cat  templates/keepalived.conf.j2
{% if ansible_hostname  "web01"  %}
 state  主节点
{% elif ansible_hostname  "backup" %}
 state  备节点
{% endif %}

3.循环

配置文件server .conf web服务器的/tmp/目录下
10 .0.0.5
10 .0.0.6
10 .0.0.7
10 .0.0.8
10 .0.0.9
10 .0.0.10

{% for ip in [1,2,3,4,5,6] %}
10 .0.0.{{  ip  }}
{% endfor %}
{% for ip in range(2,11) %}
10 .0.0.{{  ip  }}
{%endfor%}
{% for ip in ["lidao","oldwang"] %}
10 .0.0.{{  ip  }}
{%endfor%}

 

posted on 2026-05-16 16:44  杨梅冲  阅读(11)  评论(0)    收藏  举报