网站集群批量管理-Ansible剧本与变量

复盘内容:链接指南

查看ansible命令文档

sh 复制代码
ansible-doc -s systemd

遇到复制VIM丢失bug------文章参考

产生原因:vi/vim中没有进入编辑模式,所以复制文本的时候,遇到o,i等进入编辑模式的字母时,之后的文本才会复制进去,所以之前的文本就看不到了。

解决方案:粘贴的时候,先进入编辑模式

一、剧本

何为剧本:

playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量

剧本yaml格式,yaml格式的文件:空格,冒号.

剧本未来我们批量管理,运维必会的内容.

ans剧本 ans ad-hoc
共同点 批量管理,使用模块 批量管理,使用模块
区别 重复调用 不是很方便,不容易重复
应用建议(应用场景) 部署服务,多个步骤的任务 测试模块,临时性任务

案例:脚本书写格式

yaml 复制代码
---
- hosts: all
  tasks:
    - name: 01 打开冰箱门
      shell: echo 1 >>/tmp/bingxiang.log
    - name: 02 把大象放入冰箱
      shell: echo 2 >>/tmp/bingxiang.log
    - name: 03 关上冰箱的门
      shell: echo 3 >>/tmp/bingxiang.log
sh 复制代码
#书写剧本 注意以.yml或.yamt结尾 01.show.yml
#执行脚本 
mv /etc/ansible/hosts .
#-i 指定主机清单文件,如果不写默认调用/etc/ansible/hosts
ansible-playbook -i hosts 01.show.yml

执行的时候有奶牛:

可以删除软件或修改ansible.cfg配置进行关闭 #nocows =1去掉注释即可

书写Ans playbook注意事项:

  • 同一个层级的内容对齐的0
  • 不同层级的通过2个空格对齐
  • 不能使用tab键

二、剧本案例

1、案例01: 创建目录并分发文件

创建目录/server/files/etc/hosts文件并且发送过去/server/files

yaml 复制代码
---
- hosts: all
  tasks:
    - name: 01 创建目录/server/files
      file: 
        path=/server/files 
        state=directory
    - name: 02 分发文件
      copy: 
        src=/etc/hosts 
        dest=/server/files

2、案例02:分发软件包,安装软件包,启动服务

zabbix-agent软件包(下载)---》 安装软件包---》配置(略)---》启动开机自启动

yaml 复制代码
---
- hosts: all
  takes: 
    - name: 01 软件包下载
      get_url: 
        url: https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm
        dest: /tmp/
        validate_certs: no
    - name: 02 安装软件包
       yum:
        name:/tmp/zabbix-agent-6.0.13-release1.el7.x86_64.rpm
        state=insatlled
    - name: 03 配置 
       debug:
        msg: "进行配置zabbix-agent"
    - name: 04 启动
       systemd:
        name: zabbix-agent
        enabled: yes
        state: started
sh 复制代码
ansible all -m shell -a 'ps -ef | grep zabbix'

不能使用-m command。在 Ansible 的命令模块中,你需要以单个字符串的形式指定要执行的命令,而不能使用管道符号 |

3、案例03:nfs服务

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

写剧本必备-列出流程

服务端流程:

  • 部署nfs-utils,rpcbind
  • 修改配置文件
  • 创建共享目录并改所有者
  • 启动服务rpcbind,nfs(注意顺序)

客户端流程:

  • 安装nfs-utils2.
  • 挂载与永久挂载
yaml 复制代码
---
- hosts: nfs
  tasks: 
    - name: 01 部署nfs-utils,rpcbind
      yum: 
        name: nfs-utils
        state: installed
    - name: 02 修改配置文件
      lineinfile:
        path: /etc/exports
        line: "/backup-nfs/ 111.229.205.0/24(rw)"
        create: true
    - name: 03 创建共享目录并且修改权限
      file: 
        path: /backup-nfs/
        state: directory
        owner: nfsnobody
        group: nfsnobody
    - name: 04-1 依次启动服务rpc
      systemd: 
        name: rpcbind
        enabled: yes
        state: started
    - name: 04-2 依次启动服务nfs
      systemd: 
        name: nfs
        enabled: yes
        state: started
- hosts: web
  tasks: 
  - name: 01 部署nfs-utils,rpcbind
    yum: 
      name: nfs-utils
      state: installed
  - name: 02 永久挂载
    mount:
      src: 43.137.51.152:/backup-nfs/
      path: /data/
      fstype: nfs
      state: mounted

三、Ansible中的变量

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

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

可以定义变量的地方 说明
在剧本文件中定义 比较常用。仅仅限于当前的play使用,
register变量(注册变量) ip= hostname -I,实现脚本中反引号的功能,可以获取命令结果
变量文件,根据主机清单分分组进行定义变量 如果多个剧本,使用相同的变量,大型的剧本roles
inventory主机清单中定义变量 未来可以用于批量修改主机使用,其他很少用了
命令号中 几乎不用
facts变量 一般用于获取主机基本信息:ip,主机名,系统(centos/ubuntu)如果不需要可以关闭,用于加速剧本的执行

3.1、剧本中的变量

在剧本play中定义变量应用:

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

使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号.

yaml 复制代码
#dir就是变量,变量的内容:右边的内容
​
- hosts: all
  vars:
    dir: /oldboy/lidao/upload/
  tasks:
    - name: mkdir
      file:
        path: "{{ dir }}"
        state: directory

面试常问:使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号.

3.2、共用变量-变量文件

yaml 复制代码
[root@m01 /server/scripts/playbook]# cat 05.vars.yml
- hosts: all
  vars_files: ./vars.yml
  tasks:
    - name: file
      file:
        path: "{{ dir  }}/{{ user }}-{{ file }}"
        state: touch

3.3、共用变量-根据主机组使用变量

group_vars根据主机清单的分组去匹配

yaml 复制代码
group_vars/
  lb/vars.yml #存放lb组的变量
  web/vars.yml #存放web组的变量
  data/vars.yml #存放xxx组的变量
  all/vars.yml #所有主机共用的变量
未来一般使用all分组即可,把所有变量存放在一起,供剧本使用
yaml 复制代码
user: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 172.16.1.41
rsync_pass: 1

3.4、facts变量

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

facts变量setup模块获取

3.5、register变量注册变量

本质上就是用来实现脚本中的反引号功能

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

yaml 复制代码
- hosts: all
  tasks:
   - name: get date
     shell: date +%F
     register: result
   - name: print result 变量内容
     debug:
       msg: "register变量的全部内容是:{{result.stderr }}"
            "register变量的精确的内容是:"{{result.stdout}}"

json形式数据.------》key: value

register变量result.

result.stdout==std standard output 标准输出.

相关推荐
Raners_5 分钟前
【Linux】文件权限以及特殊权限(SUID、SGID)
linux·安全
egoist20238 分钟前
【Linux仓库】进程优先级及进程调度【进程·肆】
linux·运维·服务器·进程切换·进程调度·进程优先级·大o1调度
2301_1472583691 小时前
7月2日作业
java·linux·服务器
格调UI成品2 小时前
预警系统安全体系构建:数据加密、权限分级与误报过滤方案
大数据·运维·网络·数据库·安全·预警
xuanzdhc6 小时前
Linux 基础IO
linux·运维·服务器
愚润求学6 小时前
【Linux】网络基础
linux·运维·网络
bantinghy6 小时前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志7 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手7 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux