Ansible剧本

ansible剧本类似于shell脚本 但是他有自己的语法规范

ansible剧本作用介绍

(1) 可以实现服务自动部署
(2) 可以提高运维工作效率
(3) 可以较少运维工作问题(报错)
(4) 可以节省公司运维成本

  • 剧本编写组成:
    (1) 剧本的角色信息: hosts: xx(定义主机信息)
    (2) 剧本任务信息: tasks: (定义任务信息)

剧本的编写规范

编写规范遵循yaml语法规范

  1. 缩进规范 两个空格表示一个缩进
    不平级标题之间开头相隔两个空格
    注意: 缩进只能以空格表示 tab会报错
  2. 字典规范 冒号后面要有空格
    例: shell: 命令信息
    注意: 冒号结尾时不需要有空格 注释信息中冒号也不需要
  3. 列表规范: 横线后面要有一个空格
    例:
 name: 
- nfs
- rsync

剧本编写及注意事项

编写脚本时要用.yml当后缀 方便显示剧本内编写格式
vim test.yml

  1. 执行剧本命令:
    ansible-playbook 剧本路径
  2. 测试剧本命令:
    ansible-playbook -C 剧本路径
  3. 检测剧本语法是否错误:
    ansible-playbook --syntax-check 剧本路径

PS: 剧本写完后先进行语法检查 然后在测试剧本 最后在执行

编写剧本: rsync自动搭建项目

#rsync服务自动搭建

- hosts: rsync_serve  定义执行命令的主机组(角色)
  tasks:              定义需要执行的命令 (剧本) 
  - name: 分发编写的配置文件    注释信息 将任务分隔开 报错容易排查
    copy: src=/server/playbook/deploy/rsyncd.conf dest=/etc/

  - name: 创建用户    缩进两个空格 
    user: name=rsync shell=/sbin/nologin create_home=no

  - name: 创建目录 赋予权限   - name: 代表列表信息
    file: path=/backup owner=rsync group=rsync state=directory

  - name: 创建书写验证文件
    copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600

  - name: 启动服务
    service: name=rsyncd state=started enabled=yes

#rsync客户端搭建

- hosts: rsync_client  另一角色组
  tasks:               新定义的剧本
  - name: 编写密码文件
    copy: content='123456' dest=/etc/rsync.password mode=600

  - name: 创建测试文件
    file: path=~/test.txt state=touch

  - name: 测试是否可用
    shell: rsync -avz /root/test.txt  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

  - name: 删除测试文件
    file: path=~/test.txt state=absent

剧本编写扩展功能

在剧本中设置变量信息

vars: 指定变量信息
方法一: 在剧本中设置变量

- hosts: 172.16.1.41
  Vars:         设置变量命令
    - Abc: 123     设置的变量
  tasks:
    - name: 注释信息
      copy: src={{ Abc }}  引用变量 用两个花括号引用并变量两边都有空格分隔

方法二:在命令中设置变量
ansible-playbook -e abc=123 xxx剧本
参数-e 设置临时变量

方法三: 在主机清单中设置

(1) 单个主机设置变量
172.16.1.31 Abc=123

(2) 多个主机设置变量
[backup]
172.16.1.41
172.16.1.31
[backup:vars]
Abc=123

PS: 三种变量命令行配置变量优先级最高
其次为剧本中设置
最后为主机清单配置

在剧本中设置注册信息

register: 指定注册信息
在执行剧本时不会输出信息 注册功能就是将某些信息输出显示出来

- hosts: nfs_client
tasks:
        - name: mount dir
          mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
        - name: check mount
          shell: df -h
          register: oldboy                  在要输出内容的命令下写入 设置变量
        - name: display mount info          因为shell和debug不能再一条中所以分开
          debug: msg={{ oldboy.stdout_lines }}  引用变量 输出内容

PS:
register: 指定一个变量 赋予上方命令执行结果
debug: 排查模块 可指定内容在剧本执行时进行输出
.stdout_lines 指定输出内容更容易看懂

在剧本中设置判断信息

when: 指定判断信息
判断一些主机是否符合条件 按条件判断是否执行某些命令以便更灵活的管理主机

判断常用信息

Ansible 172.16.1.41 -m setup -a “ansible_hostname”(收集主机所有信息)
常用主机信息:

      ansible_all_ipv4_addresses:               仅显示ipv4的信息。
      ansible_devices:                          仅显示磁盘设备信息。
      ansible_distribution:                     显示是什么系统,例:centos,suse等。
      ansible_distribution_major_version:       显示是系统主版本。
      ansible_distribution_version:             仅显示系统版本。
      ansible_machine:                          显示系统类型,例:32位,还是64位。
      ansible_eth0:                             仅显示eth0的信息。
      ansible_hostname:                         仅显示主机名。
      ansible_kernel:                           仅显示内核版本。
      ansible_lvm:                              显示lvm相关信息。
      ansible_memtotal_mb:                      显示系统总内存。
      ansible_memfree_mb:                       显示可用系统内存。
      ansible_memory_mb:                        详细显示内存情况。
      ansible_swaptotal_mb:                     显示总的swap内存。
      ansible_swapfree_mb:                      显示swap内存的可用内存。
      ansible_mounts:                           显示系统磁盘挂载情况。
      ansible_processor:                        显示cpu个数(具体显示每个cpu的型号)。
      ansible_processor_vcpus:                  显示cpu个数(只显示总的个数)。
判断信息设置方法
- hosts: all
  tasks:
    - name: install software
      yum: name=nfs-utils state=installed
    - name: create data dir
      file: path=/data/ state=directory
      when: (ansible_hostname == "nfs01") 判断符合主机名为nfs01的才可执行上面命令
PS: when: (判断条件 == “条件值”) when剧本内置判断命令

判断语法结构信息:

  1. 匹配单个信息:
    when: (ansible_hostname == "nfs01")
    (匹配符合这个条件的才可以)

  2. 匹配多个信息
    when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
    (或者关系 满足其中一个条件就可以)
    when: (ansible_hostname == "nfs01") and (ansible_eth0 == "10.0.0.31")
    (并且关系 满足多个条件才可以)

  3. 对匹配信息进行取反
    when: (ansible_hostname != "nfs01")
    (匹配不符合这个条件的才可以)

剧本中的循环功能

with_items: 指定循环信息
同一条命令多次执行时可用循环模式

- hosts: 172.16.1.41
  tasks:
  - name: 批量创建用户
    user: name={{ item }} 
    with_items:
      - oldboy
      - rsync
    with_items 定义变量循环  上面{{ }} 引用循环 
也可写作
- hosts: 172.16.1.41
  tasks:
  - name: 批量创建用户
    user: name={{ n1 }} shell={{ n2 }} uid={{ n3 }}
    with_items:
      - {n1: ‘rsync01’, n2: ‘/sbin/nologin’, n3: ‘3001’}
      - {n1: ‘rsync02’, n2: ‘/bin/bash’,n3: ‘3002’}
第一次循环会读取第一条的内容并被上面引用 第二次循环会引用第二条的内容从而达到多次循环

剧本的忽略错误功能

ignore_errors: yes 指定忽略错误信息
因为剧本的特性 逐条执行剧本 所有当剧本中某条命令报错 剧本就会停止
这样对shell等没有密等性的命令很不友好 这里就需要忽略错误继续执行后面的剧本

- hosts: 172.16.1.41
  tasks:
  - name: 错误忽略功能
    shell: useradd rsync   当有这个用户 就会报错
    ignore_errors: yes     开启忽略当前错误(忽略这一个name条目中所有命令的错误)

剧本中标签功能

剧本中写入tags: 指定标记信息
命令行输入参数 -t 指定单独执行剧本内的标记命令
命令行输入参数 –skip-tags 指定除了标记信息剩下的全执行
把某条命令标记上 以便拿出来单独执行或跳过 就不执行那条命令

- hosts: 172.16.1.41
  tasks:
  - name: 标签功能
    shell: mount -t nfs 172.16.1.41:/data /mnt
  - name: 标签功能  
    shell: mount /dev/sbd2 /tmp
    tags: moot      自己定义

命令行输出:第一种
 ansible-playbook xx.yml -t moot          只执行标记的任务
 ansible-playbook xx.yml –skip-tags moot  指定不执行这条命令 执行其他的

取消剧本收集主机信息功能

加快剧本运行速度
gather_facts: no 指定是否关闭收集主机信息功能 当关闭时 判断功能无法使用

- hosts: backup 
  gather_facts: no     指定关闭收集主机信息功能 默认为yes
  tasks: 
  - name: xxx      

剧本触发功能配置

notify: xx 定义触发器名称
handlers: 定义触发触发器后执行的命令
当有些配置文件做出改变时 需要重启服务 这时需要触发器 当检查到文件改变就会触发触发器

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

推荐阅读更多精彩内容