Ansible(三)剧本

剧本:

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

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

剧本是属于批量管理,运维必会的内容。

and剧本与and ad-hoc:他们都可以批量管理,使用模块,但也有不同;

and剧本可以重复调用,而ans ad-hoc不容易重复调用,重复使用是不是很方便;

建议:

当部署服务,有多个步骤的任务布置时,建议用剧本;

如果仅测试模块,临时性的任务,建议用ad-hoc。

---------------------------------------------------------

剧本书写格式:


Ansible简单剧本示例

文件解析:

第一行顶头三减号,可以不写;

第二行指定角色,批量执行命令的server

第三行以后就是任务列表tasks了:

- name: 就是说明性描述等;

shell: 指定模块后就可以进行操作执行了;

书写剧本 注意以.yml或.yaml结尾;

书写Ans playbook注意事项:

同一个层级的内容对齐的.

不同层级的通过2个空格对齐

不能使用tab键

可以将剧本的脚本统一放一个文件目录下:/server/script/playbook下,同时将hosts文件也复制过来,好指定主机

[root@m01 /server/script/playbook]# cp /etc/ansible/hosts .(注意,这里最后有个点,当前目录,可能看不到)

照着上边的图片书写第一个剧本

执行剧本:

[root@m01 /server/script/playbook]# ansible-playbook -i hosts 01.show.yml

#执行完,在server上可以看到,对应/tmp/ans-test.log文件有01/02/03的输出;

---------------------------------------------------------

案例01: 创建目录/server/files/并分发文件/etc/hosts到/server/files/

中间转换步骤: 任务的步骤--> 模块(命令行)

[root@m01 ~]# ansible all -m file -a 'path=/server/files/ state=directory'

[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/server/files/'

终极目地:转换为剧本

---

- hosts: all

  tasks:

    - name: 01 选创建目录

      file: path=/server/files/ state=directory

    - name: 02 分发文件

      copy: src=/etc/hosts dest=/server/files/

#脚本完

注意,这晨file与copy后,一行搞定了,选项后加=号,可以这样写,如果是多行,选项后需要用:号,如下:

---

- hosts: all

  tasks:

    - name: 01 选创建目录

      file:

        path: /server/files/

        state: directory

    - name: 02 分发文件

      copy:

        src: /etc/hosts

        dest: /server/files/

---------------------------------------------------------

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

zabbix-agent软件包(下载)

安装软件包

配置(略)

启动开机自启动

需要用到的模块:get_url  |  yum  |  lineinfile  |  systemd

脚本如下:

---

- hosts: centos

  tasks:

    - name: 01 下载软件包到/tmp/下

      get_url:

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

        validate_certs: no #类似于wget中的--no-check-certificate

        dest: /tmp/

    - name: 02 安装软件包

      yum:

        name: /tmp/zabbix-agent-6.0.7-1.el7.x86_64.rpm

        state: present

    - name: 03 配置

      debug:

        msg: "这里就用debug模块的msg,输出点信息,模拟配置了文件"

    - name: 04 服务启动

      systemd:

        name: zabbix-agent

        enabled: yes

        state: started

#至此,脚本完

---------------------------------------------------------

案例03: nfs服务

nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名用户:nfsnobody

nfs客户端:web挂载 /ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)

第一步:列出流程

服务端流程:

1. 部署nfs-utils,rpcbind

2. 修改配置文件

3. 创建共享目录并改所有者

4. 启动服务rpcbind,nfs(注意顺序)

客户端流程:

1. 安装nfs-utils

2. 挂载与永久挂载

第二步:根据步骤写流程剧本,如下:

---

#nfs服务端部署

- hosts: backup

  tasks:

    - name: 01 server部署nfs-utils, rpcbind

      yum:

        name: nfs-utls,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: nfsnobody

        group: nfsnobody

        state: directory

    - name: 04 启动服务rpcbind,nfs(注意顺序)

      systemd:

        name: rpcbind

        enabled: yes

        state: started

    - name: 04 续,启动服务rpcbind,nfs(注意顺序)

      systemd:

        name: nfs

        enabled: yes

        state: started

#nfs客户端部署

- hosts: web

  tasks:

    - name: 01 部署nfs-utils

      yum:

        name: nfs-utls

        state: present

    - name: 02 挂载nfs

      mount:

        src: 172.16.1.41:/backup-nfs

        path: /ans-upload

        fstype: nfs

        state: mounted

============================================================================

Ansible中的变量

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

比较常用的创建变量的地方:剧本中,类似于``(反斜杠)功能,共用的变量文件。

可以定义变量的地方:

1、在剧本文件中定义,这个比较常用. 仅仅限于当前的play使用;

2、register变量(注册变量),如ip=`hostname -I`,可以实现脚本中反引号的功能,可以获取命令结果

3、变量文件, **根据主机清单分分组进行定义变量 **,场景:如果多个剧本,使用相同的变量,大型的剧本roles

4、inventory主机清单中定义变量,可以用于批量修改主机使用,其他很少用了.

5、命令行中,几乎不用.

6、facts变量,一般用于获取主机基本信息:ip,主机名,系统(centos/ubuntu);如果不需要可以关闭,用于加速剧本的执行

---------------------------------------------------------

剧本中使用变量

批量创建/test-vir/test/upload/

vars : variable 变量的内容,变量.

dir就是变量,变量的内容:右边的内容.

cat 05.vars.yml

- hosts: all

  vars:

    dir: /test-vir/test/upload/

  tasks:

    - name: 创建目录

      file:

        path: "{{ dir }}"

        state: directory

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

path: /test-vir/{{ dir }} #这种可以不加引号,变量不是开头

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

1. 仅仅在当前play生效;

2. 一般用来存放路径,用户名,ip地址,类似于之前使用的脚本;

3. 注意引号使用。

---------------------------------------------------------

共用变量-变量文件

cat 05.vars.yml

---

- hosts: all

  var_files: ./vars.yml

  tasks:

    - name: file test

      file:

        path: "{{ dir }}/{{ user }}-{{ file }}"

        state: touch

cat vars.yml

dir: /tmp/

file: test.txt

user: mclind

#文件完

---------------------------------------------------------

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

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

变量文件;

主机组创建变量文件;

目录如下:

group_vars/ #下边是这个目录下的结构

      lb/vars.yml #存放lb组的变量

      web/vars.yml #存放web组的变量

      data/vars.yml #存放data组的变量

      all/vars.yml #所有主机共用的变量

一般使用all分组即可,把所有变量存放一起供剧本使用

[root@m01 /server/script/playbook]# mkdir -p group_vars/all/

[root@m01 /server/script/playbook]# vim group_vars/all/vars.yml

user: www

nfs_dir: /nfs_backup

web_mount_dir: /web_nfs

nfs_server: 172.16.1.41

rsync_pass: 1

#变量脚本完,接下来就可以写测试脚本了

cat test.yml

- hosts: all

  tasks:

    - name: 测试group变量

      debug:

        msg: "变量内容{{user}} {{rsync_pass}}"

- hosts: web

  tasks:

    - name: 测试web组是否识别group变量

      debug:

        msg: "web组识别的变量内容{{user}} {{rsync_pass}}"

---------------------------------------------------------

facts变量

ans内置变量,ans运行剧本的时候会有一个默认的task(Gathering Facts),这个背后在收集每个主机的基本信息。(比如,IP,主机名,磁盘,这个主机的各种信息)

这些基本信息就称为facts变量;

facts变量setup模块获取

[root@m01 ~]# ansible backup -m setup

常用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

批量修改系统/etc/motd文件,登录的时候输出系统的基本信息.

输出主机名

输出内存总大小

输出ip地址

发行版本

cpu数

核心数

#1. 创建包含变量的模板文件

#2. 发送模板文件替代/etc/motd 即可

cat 07.change_motd.yml

- hosts: all

  tasks:

    - name: 分发motd文件

      template:

        src: templates/motd.j2

        dest: /etc/motd

        backup: yes

    - name: 分发motd文件

      cp:

        src: templates/motd.j2

        dest: /tmp/motd

        backup: yes

[root@m01 ~]# 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 }}

注:template vs copy模块

copy仅仅传输数据,复制文件.

template 传输数据,复制文件的时候,文件中的变量会被解析和运行。

关于facts变量实际应用案例:

1. 通过facts变量获取系统的基本信息

2. 通过facts变量获取信息并进行判断

3. 如果不需要可以进行关闭,加速剧本的运行( gather_facts: no)。


如何关闭facts

---------------------------------------------------------

register变量注册变量

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

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

某个Register变量的信息:date

{

'stderr_lines': [],

u'changed': True,

u'end': u'2022-08-24 16:38:27.887829',

'failed': False,

u'stdout': u'2022-08-24',

u'cmd': u'date +%F',

u'rc': 0,

u'start': u'2022-08-24 16:38:27.860574',

u'stderr': u'',

u'delta': u'0:00:00.027255',

'stdout_lines': [u'2022-08-24'],

'ansible_facts': {u'discovered_interpreter_python':

u'/usr/bin/python'}

这里是JSON,字典格式;

json形式数据.

key: value

键: 值

变量: 内容

cat 08.reg-var.yml

- hosts: all

  tasks:

    - name: get date

      shell: date +%F

        registr: result

    - name: print result 变量内容

      debug:

        msg: |

        "registr变量的全部内容是:{{ result.stderr }}"

        "register变量的精确的内容是:{{ result.stdout }}"

        #也可以先打印一行

        msg:  dater命令结果,{{ result }}

注:

stdout部分是我们想要的内容.

register变量result.

result.stdout #std standard output 标准输出

msg:中的|表示下面的内容是多行. |也可以用于其他模块中.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容