老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

【linux云计算SRE课程】Ansible-playbook剧本!

老男孩IT教育

技术博客

2022年10月12日 16:13

Playbook 与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用

  Playbook 与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用

  playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色

  从根本上来讲,所谓的task无非是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务

linux培训班

  Playbook使用场景

  1、执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行的ad-hoc命令是不合适的,这时候最好使用playbook

  2、就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式

  3、使用playbook可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码

  4、在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook可以把常见的应用都编写playbook,之后管理服务器会变得很简单

  Playbook核心元素

  Hosts 执行的远程主机列表

  Tasks 任务集

  Varniables 内置变量或自定义变量在playbook中调用

  Templates 模板,即使用模板语法的文件,比如配置文件等

  Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

  tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码

  Playbook语法

  playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略

  次行开始正常写playbook的内容,一般都会写上描述该playbook的功能

  使用#号注释代码

  缩进必须统一,不能空格和tab混用

  缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的

  YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感

  k/v的值可同行写也可以换行写。同行使用:分隔

  v可以是个字符串,也可以是一个列表

  一个完整的代码块功能需要最少元素包括 name: task

  playbook与AD-Hoc的关系

  ①playbook是对AD-Hoc的一种编排方式

  ②playbook可以持久运行(重复),而Ad-Hoc只能临时运行

  ③playbook适合复杂的任务,而Ad-Hoc适合做快速简单的任务(检查,查询, 巡检)

  ④playbook能控制任务执行的先后顺序

  ad-hoc 用于检查,测试,临时获取数据

  playbook剧本适用于,重复性操作(部署环境、服务,初始化操作(优化))

  Playbook急速入门

  剧本格式叫yaml格式为yml

  缩进不要用tab键,要用空格键

  核心格式剧本中所有的内容要对齐

  对齐的时候不能使用tab键

  只能使用空格,2个空格

  hosts用于指定在哪些主机执行指令

  tasks: 用于对于这些主机,运行什么模块及选项

  | hosts 配置介绍

# cat /etc/ansible/hosts

[web]

10.0.0.101

10.0.0.102

[nfs]

10.0.0.103

[backup]

10.0.0.104

  | 在所有机器的/tmp下面创建oldboy.txt

# 创建存放剧本的目录

mkdir -p /oldboyedu/ansible/playbook/

# yml文件配置

cat >01.touch.yml<<EOF

- hosts: all

vars:

  filename: oldboy.txt

tasks:

   - name: touch file

    shell: touch /tmp/{{ filename }}

EOF

# 运行playbook剧本

ansible-playbook 01.touch.yml

  | 添加定时同步时间的定时任务

  原始命令行的ansible命令:

ansible all  -m cron -a 'name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
ansible all  -a 'crontab -l'

  修改为剧本之后:

# 简单粗暴版本

---

- hosts: all

tasks:

   - name: add cron sync time

    cron: name="sync time by lidao996 20221111" minute="*/2"  job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present

     

# 格式优化后

---

- hosts: all

tasks:

   - name: add cron sync time

    cron:

      name: "sync time by oldboyedu"

      minute: "*/2"

      job: "/sbin/ntpdate ntp1.aliyun.com &>/dev/null"

      state: present

  在剧本中使用模块和选项

  选项最好是一行一个选项,选项后面的跟着冒号

  选项要对齐与缩进

  | 批量下载安装zabbix-agent2客户端并启动

  部署流程

  剧本编写

- hosts: 10.0.0.101

tasks:

   - name: 1. download zabbix agent2 rpm

    get_url:

        url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.0-1.el7.x86_64.rpm

        dest: /tmp/

        validate_certs: no

   - name: 2. install zabbix agent2 rpm

    yum:

      name: /tmp/zabbix-agent2-6.0.0-1.el7.x86_64.rpm

      state: installed

   - name: 3. start zabbix agent2 service

    systemd:

      name: zabbix-agent2

      enabled: yes

      state: started

  | 部署rsync服务端

  准备:当前目录中包含,rsyncd.conf配置文件

  剧本编写

- hosts: backup

tasks:

   - name: 1)服务部署:yum 安装rsync

    yum:

      name: rsync

      state: latest
       

   - name: 2)配置文件分发

    copy:

      src: /tmp/rsyncd.conf

      dest: /etc/rsyncd.conf

      backup: yes


   - name: 3)创建虚拟用户rsync

    user:

      name: rsync

      shell: /sbin/nologin

      create_home: no

      state: present

       
   - name: 4)密码文件和权限

    lineinfile:

      path: /etc/rsync.password

      mode: 0600

      line: "rsync_backup:1"

      create: yes

       
   - name: 5)修改模块对应目录的所有者

    file:

      path: /data/

      owner: rsync

      group: rsync

      state: directory


   - name: 6)重启rsync服务

    systemd:

      name: rsync

      enabled: yes

      state: started

  Ansible变量相关

  变量分类

  | vars, vars_files, group_vars方式

  方法一:vars

  剧本中定义变量

- hosts: all

vars:

  dir_name: /oldboyedu

  file_name: oldboy.txt

tasks:

  - name;01. mkdir

    file:

      path: "{{ dir_name }}"

      state: directory

  - name: 02. touch

    file:

      path: "{{ dir_name }}/{{ file_name }}"

      state;touch

  方法二:vars_files

  把变量存放到一个文件中. 剧本比较大的时候

cat >vars.yml<EOF

dir_name: /oldboyedu

file_name: oldboy.txt

EOF

  剧本编写

- hosts: all

vars_file: ./vars.yml

tasks:

  - name: 01. mkdir

    file:

      path: "{{ dir_name }}"

      state: directory

       

  - name: 02. touch

    file:

      path: "{{ dir_name }}/{{ file_name }}"

      state: touch

  方法三:group_vars

  创建一个变量文件,给某个组共用

  用法:

  需要创建一个group_vars目录

  目录下面创建以主机组命名的目录

  存放变量文件vars.yml

  根据不同的主机组创建对应的目录

  变量文件内容

# cat group_vars/backup/vars.yml

dir_name: /oldboy_backup

# cat group_vars/web/vars.yml

dir_name: /oldboy_web

  剧本内容

- hosts: all

tasks:

   - name: 根据不同主机创建不同目录

    file:

      path: "{{ dir_name }}"

      state: directory

  使用group_vars的all组定义变量

  变量文件内容

# cat group_vars/all/vars.yml

dir_name: /oldboyedu_all

file_name: oldboy.txt

  剧本内容

- hosts: all

tasks:

   - name: 01. mkdir

    file:

      path: "{{ dir_name }}"

      state: directory

   

   - name: 02. touch

    file:

      path: "{{ dir_name }}/{{ file_name }}"

      state: touch

  变量基础定义小结

  | ansible-facts变量

  facts变量说明 : ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息

  查看 ansible facts变量内容

ansible web -m setup

  常用fact变量

  系统巡检

  获取所有机器的基础信息保存到/tmp/主机名命名文件中

  步骤:

  创建文件

  写入内容

# 剧本内容

- hosts: all

tasks:

   - name: 创建文件并写入系统基本信息

    lineinfile:

      path: /tmp/{{ ansible_hostname }}

      create: yes

      line: "主机名:{{ ansible_hostname }}\n

              ip地址:{{ ansible_default_ipv4.address }}\n

              内存总计:{{ ansible_memtotal_mb }}"

  facts小结

  如果ans中使用到了一些系统的基础信息. 比如: ip地址,主机名,时间

  如果没有这种需求或通过别的方式实现这个需求,可以关闭facts功能,让剧本执行加速. 使用gather_facts: no

- hosts: all

gather_facts: no

vars:

  dir_name: /oldboyedu

  file_name: oldboy.txt

tasks:

   - name;01. mkdir

    file:

      path: "{{ dir_name }}"

      state: directory

   - name: 02. touch

    file:

      path: "{{ dir_name }}/{{ file_name }}"

      state;touch

  | ansible-register变量

  相当于创建压缩包压缩包名字包含时间;tar打包压缩,date获取时间

tar zcf /tmp/etc-`date +%F`.tar.gz /etc/

  创建以主机名命名文件/opt/主机名

  步骤:

  获取主机名:hostname

  创建文件,使用上一步的结果


register: 变量名字  # 这个变量的内容,叫json格式.

register: hostname # json格式,只想要输出标准输出 stdout standard output 标准输出.

hostname.stdout #取出命令的结果 `hostname`



# 剧本编写

- hosts: all

tasks:

   - name: 01. 获取主机名

    shell: hostname

    register: hostname      

   - name: 输出变量内容

    debug:

      msg: "{{ hostname }}"

   - name: 02. 创建文件

    file:

      path: /opt/{{ hostname.stdout }}

      state: touch

register: hostname  

hostname.stdout  # 正常输出信息

hostname.rc      # 取出返回值.

hostname.stderr  # 取出错误信息

  | 变量小结

  为何使用变量:

  剧本,脚本使用的变量放在一个文件中,剧本开头的

  一般存放:用户名,用户组,目录,端口

  老男孩教育Linux运维云计算课程汇集了虚拟化、云计算、安全攻防、Python开发、SRE等技术,课堂效率高、内容丰富全面,由浅入深,循序渐进,帮助学员稳扎稳打,夯实基础,在有限的时间内帮助学员高效提升,成为符合企业需求的技术型人才。

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。