使用ansible的playbook完成以下操作

Ansible Playbook 入门:YAML 语法与实操步骤

一、YAML基础语法

1. 基本规则
  • 文件标识 :可选以---开头(声明YAML文件),...结尾。
  • 注释 :用#标记,从#到行尾为注释。
  • 字符串 :默认无需引号,含特殊字符(空格、冒号等)需用'"包裹。
  • 布尔值
    • 模块参数(如yumupdate_cache):支持yes/no/1/0/true/false(Ansible解析为字符串)。
    • 非模块参数(如变量):遵循YAML规范,支持True/False/yes/no/on/off(不区分大小写)。
2. 核心数据结构
  • 字典(键值对)

    • 普通格式:键: 值(冒号后必须跟空格)。

      yaml 复制代码
      web:
        server: nginx
        port: 80
    • 内嵌块格式:{键1: 值1, 键2: 值2}

      yaml 复制代码
      db: {name: mysql, port: 3306}
  • 列表(数组)

    • 普通格式:- 元素(短横线+空格前缀)。

      yaml 复制代码
      apps:
        - nginx
        - mysql
    • 内嵌块格式:[元素1, 元素2]

      yaml 复制代码
      hosts: [web01, web02]
  • 嵌套结构:通过缩进(建议2个空格)表示层级,支持字典与列表嵌套。

    yaml 复制代码
    servers:
      - name: web01
        ip: 192.168.1.10
        services: [nginx, php-fpm]

二、Ansible Playbook结构

1. 核心要素

每个Playbook由一个或多个play组成,每个play包含:

  • hosts:目标主机/组(来自inventory)。

  • tasks:任务列表(按顺序执行,所有主机完成当前任务后再执行下一个)。

    示例:

    yaml 复制代码
    ---
    - name: 部署nginx  # play名称(可选)
      hosts: webservers  # 目标主机组
      remote_user: root  # 远程执行用户
      
      tasks:
        - name: 安装nginx  # 任务1
          yum:
            name: nginx
            state: present  # 确保安装
        
        - name: 启动nginx  # 任务2
          service:
            name: nginx
            state: started  # 启动服务
2. 常用扩展字段
  • vars :定义变量(用{``{ 变量名 }}引用)。

    yaml 复制代码
    vars:
      pkg_name: nginx
    tasks:
      - name: 安装{{ pkg_name }}
        yum: name={{ pkg_name }}
  • handlers:触发器(仅在任务发生变化时执行,如配置更新后重启服务)。

    yaml 复制代码
    tasks:
      - name: 复制nginx配置
        copy:
          src: /local/nginx.conf
          dest: /etc/nginx/nginx.conf
        notify: restart nginx  # 触发handler
    
    handlers:
      - name: restart nginx  # 与notify名称匹配
        service: name=nginx state=restarted

三、Playbook使用技巧

1. 执行命令
bash 复制代码
ansible-playbook playbook.yml  # 直接执行
ansible-playbook -C playbook.yml  # 测试执行(不实际修改)
ansible-playbook --list-hosts playbook.yml  # 查看目标主机
2. Tags标签管理
  • 打标签 :用tags字段,一个任务可多个标签。

    yaml 复制代码
    tasks:
      - name: intall nginx
        yum: name=nginx
        tags: [l1,l2]
  • 执行指定标签-t 标签1,标签2

    bash 复制代码
    ansible-playbook -t l1 playbook.yml  # 仅执行install标签任务
  • 特殊标签

    • always:必执行(无论是否指定)。
    • never:默认不执行(需显式指定-t never)。
    • tagged:仅执行带标签任务(-t tagged)。
    • untagged:仅执行不带标签任务(含always)。
    • all:执行所有任务(默认)。
  • 查看标签

    bash 复制代码
    ansible-playbook --list-tags playbook.yml

通过以上内容,可快速掌握YAML语法及Ansible Playbook的编写与使用核心要点。

练习题

使用ansible的playbook完成以下操作

node1 属于 test01 主机组

node2 属于 test02 主机组

node3 和 node4 属于 web 主机组

node5 属于 test05 主机组

web 组属于 webtest 主机组

1、对node1主机操作,安装httpd服务,网页存放在/www目录中,能够通过curl http://node1访问到网页内容为welcome to luoqi

yaml 复制代码
[student@master ansible]$ vim node1web.yml

---
- name: luoqiweb
  hosts: node1
  tasks:
    - name: repo1
      yum_repository:
        name: aa
        description: aa1
        baseurl: http://ansible.example.com/rhel9/BaseOS
        enabled: yes
        gpgcheck: no

    - name: repo2
      yum_repository:
        name: bb
        description: bb1
        baseurl: http://ansible.example.com/rhel9/AppStream
        enabled: yes
        gpgcheck: no

    - name: install http
      yum:
        name: httpd
        state: present

    - name: create /www
      file:
        state: directory
        path: /www
        mode: 0777

    - name: create index.html
      copy:
        content: "welcome to luoqi \n"
        dest: /www/index.html

    - name: set http.cf1
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: DocumentRoot "/var/www/html"
        replace: DocumentRoot "/www"

    - name: set http.cf2
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: <Directory "/var/www">
        replace: <Directory "/www">

    - name: set firwalld
      firewalld:
        port: 80/tcp
        permanent: yes
        state: enabled
        immediate: yes

    - name: set sefcontext
      sefcontext:
        target: /www(/.*)?
        setype: httpd_sys_content_t
        state: present

    - name: restorecon
      shell:
        cmd: restorecon -Rv /www/index.html


    - name: restart http
      service:
        name: httpd
        state: restarted
        enabled: yes
        
[student@master ansible]$ ansible-playbook node1web.yml
[student@master ansible]$ curl http://node1
welcome to luoqi 

2、对node2主机操作,创建一个1000MiB的分区,格式化成ext4的文件系统,并挂载到/testdir目录下。

使用ansible node2 -m shell -a 'df -Th'验证

yaml 复制代码
[student@master ansible]$ vim node2parted.yml  
---
- name: node2parted
  hosts: node2
  tasks:
    - name: create parted
      parted:
        device: /dev/vdb
        number: 1
        part_type: primary
        part_start: 10MiB
        part_end: 1010MiB
        state: present

    - name: filesystemext4
      filesystem:
        dev: /dev/vdb1
        fstype: ext4

    - name: mount
      mount:
        src: /dev/vdb1
        path: /testdir
        fstype: ext4
        state: mounted

[student@master ansible]$ ansible-playbook node2parted.yml 

[student@master ansible]$ ansible node2 -m shell -a 'df -Th' 
node2 | CHANGED | rc=0 >>
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs          tmpfs     733M     0  733M   0% /dev/shm
tmpfs          tmpfs     294M  4.3M  289M   2% /run
/dev/vda3      xfs        17G  1.2G   16G   7% /
/dev/vda1      xfs      1014M  182M  833M  18% /boot
tmpfs          tmpfs     147M     0  147M   0% /run/user/1000
/dev/vdb1      ext4      966M   24K  900M   1% /testdir

3、对node3主机操作创建卷组datastorage,逻辑卷database,大小为800M,格式化为xfs的文件系统,并挂载到/lv目录下

使用ansible node3 -m shell -a 'df -Th'验证

yaml 复制代码
[student@master ansible]$ vim node3lvm.yml 

---
- name: node3lvm
  hosts: node3
  tasks:
    - name: install lvm2
      yum:
        name: lvm2
        state: present

    - name: create parted
      parted:
        device: /dev/vdb
        state: present
        number: 1
        part_type: primary
        part_start: 10MiB
        part_end: 1010MiB

    - name: create vg
      lvg:
        vg: datastorage
        pvs: /dev/vdb1

    - name: create lvm
      lvol:
        vg: datastorage
        lv: database
        size: 800M
        state: present

    - name: filesystem xfs
      filesystem:
        fstype: xfs
        dev: /dev/datastorage/database

    - name: mount lv
      mount:
        src: /dev/datastorage/database
        path: /lv
        fstype: xfs
        state: mounted

[student@master ansible]$ ansible-playbook node3lvm.yml   

[student@master ansible]$ ansible node3 -m shell -a 'df -Th' 
node3 | CHANGED | rc=0 >>
Filesystem                       Type      Size  Used Avail Use% Mounted on
devtmpfs                         devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs                            tmpfs     733M     0  733M   0% /dev/shm
tmpfs                            tmpfs     294M  4.3M  289M   2% /run
/dev/vda3                        xfs        17G  1.2G   16G   8% /
/dev/vda1                        xfs      1014M  182M  833M  18% /boot
tmpfs                            tmpfs     147M     0  147M   0% /run/user/1000
/dev/mapper/datastorage-database xfs       794M   38M  757M   5% /lv

4、创建名为/home/student/ansible/tools.yml 的 playbook,能够实现以下目的:

1)将 php 和 tftp 软件包安装到 test01、test02 和 web 主机组中的主机上

2)将 RPM Development Tools 软件包组安装到 test01 主机组中的主机上

3)将 test01 主机组中的主机上所有软件包升级到最新版本

yaml 复制代码
[student@master ansible]$ vim tools.yml  

---
- name: tools
  hosts: test01,test02,web
  tasks:

  - name: install php tftp
    yum:
      name: php,tftp
      state: present

  - name: install RPM Development Tools
    yum:
      name: "@RPM Development Tools"
      state: present

  - name: update
    yum:
      name: '*'
      state: latest

[student@master ansible]$ ansible-playbook tools.yml

5、编写剧本/home/student/ansible/jihua.yml

1)在 test02 组中的被管理主机运行

2)为用户 student 创建计划任务: student 用户每隔 5 分钟执行 echo "hello tarena"

yaml 复制代码
[student@master ansible]$ vim jihua.yml

---
- name: jihua
  hosts: test02
  tasks:
    - name: cron
      cron:
        name: 111
        user: student
        minute: " */5"
        job:  echo "hello tarena"
        
[student@master ansible]$ ansible-playbook jihua.yml 

6、创建剧本/home/student/ansible/webdev.yml,满足下列要求:

1)在 test01 主机组运行

2)创建目录/webdev,属于 webdev 组,权限为 rwxrwxr-x,具有 SetGID 特殊权限

3)使用符号链接/var/www/html/webdev 链接到/webdev 目录

4)创建文件/webdev/index.html,内容是 It's works!

5)查看 test01 主机组的 web 页面 http://node1/webdev/将显示 It's works!

yaml 复制代码
[student@master ansible]$ vim webdev.yml 

---
- name: webdev
  hosts: test01
  tasks:

    - name: groupadd
      group: 
        name: webdev
        state: present

    - name: create /webdev
      file:
        path: /webdev
        mode: '2775'
        group: webdev
        state: directory

    - name: ln /webdev
      file:
        src: /webdev
        dest: /var/www/html/webdev
        state: link

    - name: create index.html
      copy:
        content: It's works!
        dest: /webdev/index.html


    - name: restart http
      service:
        name: httpd
        state: restarted
        enabled: yes

    - name: set firewalld
      firewalld:
        port: 80/tcp
        permanent: yes
        state: enabled
        immediate: yes


    - name: set sefcontext
      sefcontext:
        target: /webdev(/.*)?
        setype: httpd_sys_content_t
        state: present

    - name: restorecon
      shell:
        cmd: restorecon -Rv /webdev/index.html

[student@master ansible]$ ansible-playbook webdev.yml 
[student@master ansible]$ curl http://node1/webdev/ 
It's works!
相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui