Linux服务器教程之十五Ansible的playbook

举报
tea_year 发表于 2025/01/22 06:52:20 2025/01/22
4k+ 0 0
【摘要】 playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。

概念

playbook

是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。

当一个设施过于复杂,需要大量的操作时候,且需要不断的重复操作,这时最好使用playbook,其使用意义类似于脚本一样,可以很方便的批处理任务,但playbook与脚本不同的是,playbook有自己的语法格式。

参考:https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html

使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)

YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

xml:数据存储的格式;

tomcat:server.xml tomcat-user.xml

json:格式,ansible回复语法格式;python,java,前端使用.json替代xml成了不同工种 不同操作系统,数据交换格式。

YMAL格式

  • 以.yaml或.yml结尾

  • 文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)

  • 以#号开头为注释

  • 列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个横杠和一个空格)

  • 一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)

  • 注意: 写这种文件不要使用tab键,都使用空格

参考: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html#yaml-syntax

下面看一个官方的示例感受一下

 ---
 # 一位职工记录
 name: Example Developer
 job: Developer
 skill: Elite
 employed: True
 foods:
     - Apple
     - Orange
     - Strawberry
     - Mango
 languages:
     ruby: Elite
     python: Elite
     dotnet: Lame

写一个playbook文件(后缀为.yml或.yml)**

 # mkdir -p /server/scripts/playbook
 ---
 - 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
 ​

第4步: 执行写好的palybook

  • 会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识

  • 执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)

 # ansible-playbook /server/scripts/playbook/01.show.yml


image-20240828215055789.png

 #验证:
 ansible all -a 'cat /tmp/bingxiang.log'
 name:提示信息,日志里面的是shell的步骤
 ​
 执行的时候有奶牛:
 可以删除软件或修改ansible.cfg配置进行关闭 #nocows = 1去掉注释即可
 #书写Ans playbook注意事项:
     同一个层级的内容对齐的
     不同层级的通过2个空格对齐
     不能使用tab键

Playbook常见语法

hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.

remote_user: 用于指定远程主机上的执行任务的用户.

 - hosts: all            
   remote_user: root 

tasks: 任务列表, 按顺序执行任务.

  • 如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.

   tasks:
   - name: 安装httpd,相关服务 ,最新版
     yum: name=httpd,httpd-devel state=latest
     
   - name: 配置文件  
     copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

handlers: 类似task,但需要使用notify通知调用。

  • 不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.

  • handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

     notify:               
     - restart apache
     
   - name: ensure apache is running (and enable it at boot)
     service: name=httpd state=started enabled=yes
     
   handlers:
     - name: restart apache
       service: name=httpd state=restarted

案例02:创建目录并分发文件

 创建目录/server/files/
 mkdir -p /server/files/
 #目标 /etc/hosts文件发送过去/server/files/
 ​
 #剧本文件  格式一..
 - hosts: all
   tasks:
   - name: 第一步创建目录
     file: path=/server/files/ state=directory
   - name: 第二步,拷贝/etc/hosts到/server/files下
     copy: src=/etc/hosts dest=/server/files/
     
 #剧本文件  格式二..
 - hosts: all
   tasks:
   - name: 第一步创建目录
     file: 
       path: /server/files/ 
       state: directory
   - name: 第二步,拷贝/etc/hosts到/server/files下
     copy: 
       src: /etc/hosts
       dest: /server/files/

variables: 变量

  • 定义变量可以被多次方便调用

 m1# vim /server/scripts/playbook/example3.yaml
 ---
  - hosts: all
    remote_user: root
    vars:                        #关键字,var+s variable变量的意思
    - myuser: test1              #定义变量: - 变量名;
    tasks:
    - name: 创建用户
      user: name={{myuser}} state=present            #{{变量}}
 m1# ansible-playbook /server/scripts/playbook/example3.yaml


1724901038912.png

去掉name,出故障3;去掉state也会出故障.

1724901278339.png

playbook实例

先直接来看一个实例

第1步: 创建一个存放playbook的目录(路径自定义)

 m1# mkdir /server/scripts/playbook

第2步: 准备httpd配置文件,并修改成你想要的配置

 m1# yum install httpd -y
 按需要修改你想要的配置(为了测试可以随意改动标记一下)
 m1# vim /etc/httpd/conf/httpd.conf

第3步: 写一个playbook文件(后缀为.yml或.yaml)

 # vim //server/scripts/playbook/03.yaml
 ---
 - hosts: all
   remote_user: root
   tasks:  
   - name: ensure apache is at the latest version    
     yum: name=httpd,httpd-devel state=latest
     
     #先忽略
   - name: write the apache config file      
     copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
     
     notify:
     - restart apache
     
   - name: ensure apache is running (and enable it at boot)
     service: name=httpd state=started enabled=yes
     
   handlers: 
     - name: restart apache
       service: name=httpd state=restarted

第4步: 执行写好的palybook

  • 会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识

  • 执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)

 # ansible-playbook /server/scripts/playbook/03.httpd.yaml


1724912356617.png

案例: playbook编排vsftpd

写一个playbook实现

  1. 配置yum

  2. 安装vsftpd包

  3. 修改配置文件(要求拒绝匿名用户登录)

  4. 启动服务并实现vsftpd服务开机自动启动

 ---
 - hosts: all                 
   remote_user: root                     
   tasks:                                
   - name: 删除目标服务器上的所有,/etc/yum.repos.d/      
     file: path=/etc/yum.repos.d/ state=absent
     
   - name: 同步master上的yum源到all
     copy: src=/etc/yum.repos.d dest=/etc/
     
   - name: yum模块安装,最新版       
     yum: name=vsftpd state=latest
     
   - name: 将m1的配置文件,拷贝到目标机         
     copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf 
     
     notify:           #通知,                  
     - restart vsftpd
     
   - name: 启动vsftp服务,设置开机自启动
     service: name=vsftpd state=started enabled=yes
     
   handlers:                     
     - name: restart vsftpd                  #接受通知,注意和上面的通知名一样!!!!        
       service: name=vsftpd state=restarted

playbook编排多个hosts任务

 ---         # ---代表开始(可选项,不写也可以)
 - hosts: 10.1.1.12
   remote_user: root
   tasks:
   - name: 创建/test1/目录
     file: path=/test1/ state=directory
     
 # 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
 - hosts: 10.1.1.13
   remote_user: root
   tasks:
   - name: 创建/test2/目录
     file: path=/test2/ state=directory
 ...         # ...代表结束(可选项,不写也可以)

1724913216768.png


案例: 编排nfs搭建与客户端挂载⭐⭐⭐⭐⭐

  • nfs服务端:在nfs01上部署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个里程碑-书写剧本
 ---
 - hosts: 172.16.1.31
   tasks:
   - name: 1.部署nfs-utils
     yum:
       name: rpcbind,nfs-utils
       state: present
   - name: 修改配置文件 /etc/exports
     lineinfile:
       path: /etc/exports
       line: "/backup-nfs 172.16.1.0/24(rw,all_squash)"
       create: true
   - name: 创建共享目录,改所有者
     file:
       path: /backup-nfs
       owner: nfsnobody
       group: nfsnobody
       state: directory
   - name: 启动服务rpcbind,nfs
     systemd:
       name: rpcbind
       enabled: true
       state: started
   - name: 启动服务nfs
     systemd:
       name: nfs
       enabled: true
       state: started
 - hosts: 172.16.1.7
   tasks:
   - name: 安装nfs-untils
     yum:
       name: rpcbind,nfs-utils
       state: present
   - name: 创建目录
     file:
       path: /ans-upload
       state: directory
   - name: 挂载与永久挂载
     mount:
       src: 172.16.1.31:/backup-nfs
       path: /ans-upload
       fstype: nfs
       state: mounted
 ​

针对多个任务的拆分

 ---                     # ---代表开始(可选项,不写也可以)
 - hosts: 172.16.3.9
   remote_user: root
   tasks:
   - include_tasks: 061.yml  
   
 # 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用---来分隔段落的)
 - hosts: 172.16.3.51
   remote_user: root
   tasks:
   - include_tasks: 062.yml
   #子文件
   [root@m01 playbook]# cat 061.yml
 - name: 创建/test1/文件
   file: path=/tmp/file666 state=touch
 ​
 [root@m01 playbook]# cat 062.yml
 - name: 创建/test22/目录
   file: path=/test22/ state=directory
 ​

总结

playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的“描述”,通过执行“剧本”的内容,让受控主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列ad-hoc模块操作已将,playbook是将该一系列操作组合起来,统一完成操作。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。