自动化运维-Ansible剧本
  • 分类:自动化运维
  • 发表:2018-06-10
  • 围观(617)
  • 评论(0)

Ansible的yaml剧本是一种简单方便,编写使用ansible_yaml脚本能轻松帮助人们快速完成大批量重复的工作。并且网上有大量的模板。
ansible-playbook 剧本编排工具--中文站:www.ansible.com.cn

ansible-playbook <file.yml>... [opt]
--check 试运行,不对主机做实际更改
--list-hosts 列出运行任务的主机
--list-tasks 列出任务列表
--limit hostlist 针对hostlist中的主机进行执行
-v -vv -vvv 显示执行的详细信息

剧本使用yaml语言编写,是一种标记语言,格式要求严格。官方网站:www.yaml.org
同一个文件中可以存放多个档案(语句段),使用 --- 进行分割
第二行开始playbook正文,建议写明playbook功能
使用#表示注释
缩进必须统一,不能空格和tab混用
缩进级别也必须同意,yaml语言通过缩进判断代码的级别
k/v值大小写敏感,k和v可以在不同的行(key:value的形式即k/v结构)
v可以是字符串,也可以说是另一个列表
一个完整的代码块最少元素需要包括name:task
一个name只能包括一个task
约定的扩展名通常为yml或者yaml

列表,元素使用 - 开始
字典,通常由k/v组成,多个k/v可以放在多行,也可以放在一行但要使用花括号并且使用逗号将不同的k/v隔开
hosts:主机列表,和ansible命令中hostlist格式相同
tasks:任务集
varniables:内置变量或自定义变量在playbook中调用
templates:模版,可替换模版中的变量实现一些简单逻辑的文件
handlers:和notity结合使用,当特定条件触发时才执行操作
tags:标签(可以通过标签执行指定的代码段)
如:ansible-playbook -t tag file.yml

剧本示例:

---                                                     约定俗成,表示开始。无实际意义。
- hosts: web                                            指定要操作的主机(即主机列表)
  remote_user: root                                     以指定的身份执行命令

  tasks:
    - name: hello                                       任务名称,描述,通常用来简单介绍剧本的功能
      command: hostname                                 任务内容,使用command模块执行hostname
    - name: create file
      file: name=/root/file state=touch                 使用file模块创建一个文件
    -name: create user
      user: name=mrhan shell=/usr/bin/zsh               使用user模块创建一个用户
    -name: install httpd
      yum: name=httpd                                   使用yum模块安装httpd服务
    -name: start http service
      service: name=httpd state=started enabled=yes     使用service将HTTP服务启动并设置开机启动

---
- hosts: all
  remote_user: root

  tasks:
    - name: handlers and notify test,install package
      yum: name=httpd
    - name: copy  conf file
      copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart httpd
    - name: start service
      service: name=httpd state=started
  handlers:
    -name: restart httpd
     service: name=httpd state=restarted

使用notify监听任务的执行,当发生变化的时候执行指定的handlers动作
可以同时指定多个handlers,当同时执行多个handlers的时候,需要在每一个动作前加 -
注意,如果同一个任务中使用相同的模块,需要放在多个name中

---
- hosts: all
  remote_user: root

  tasks:
    - name: handlers and notify test,install package
      yum: name=httpd
      tags: inshttp
    - name: copy  conf file
      copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/ backup=yes
    - name: start service
      service: name=httpd state=started
  handlers:
    -name: restart httpd
      service: name=httpd state=restarted

可以使用 -t选项来指定某个标签,用来只执行标签标记的代码
ansible-playbook -t inshttp file.yml

使用ansible-playbook file.yml来执行剧本
如果命令或脚本退出状态码不为0会导致后续执行受到影响,可以参考下面的示例解决
shell:/usr/bin/cmd || /bin/true
或者使用ignore_errors忽略错误
shell:/usr/bin/cmd
ignore_errors: True

ansible-playbook中使用变量
变量名:仅能由数字、字母和下划线组成,且只能以字母开头
变量来源

1、ansible setup 模块 远程主机的变量,可以直接调用
此模块可以显示对应设备上ansible支持的所有变量(包含对应设备的各种信息)
ansible host-pattern -m setup -a 'filter=variablename'
使用上面的命令可以查看指定变量的信息

2、/etc/ansible/hosts 在此文件中自定义
普通变量:主机组中对主机进行单独定义,优先级高于公共变量
公共变量:针对主机组中所有主机定义的统一变量

示例:针对主机定义不同的变量(在/etc/ansible/hosts中定义)
[web]
192.168.11.2 ssh_port=1024
192.168.11.3 ssh_port=2048

[web:var]
fhostname=ssh_server

---
- hosts: web
  remote_user: root

  tasks:
    - name: set hostname
      hostname: name={{ fhostname }}{{ ssh_port }}

ansible-playbook file.yml

3、直接通过命令进行声明
ansible-playbook -e 'v=value' file.yam 通过命令声明,优先级最高
ansible-playbook -e 'v1=value v2=value1' 可以同时对多个变量进行赋值

4、在playbook(剧本)中直接定义,使用的时候需要使用两个花括号

---
- hosts: all
  remote_user: root

  vars:
    - var1: value1
    - var2: value2

  tasks:
    - name: handlers and notify test,install package
      yum: name={{ value1 }}
Top