目录

  • 一、剧本的前置知识点
    • 1、主机清单
    • 2、YAML
      • (1)基本语法规则
      • (2)YAML支持的数据结构
  • 二、Ansible的脚本------playbook
    • 1、playbooks的组成部分
    • 2、执行playbook
    • 3、hosts和users介绍
    • 4、tasks列表和action
    • 5、Handlers介绍
    • 6、playbook使用变量
      • (1)通过ansible命令传递
      • (2)直接在yaml中定义变量
      • (3)直接引用一些变量
    • 7、条件测试
    • 8、迭代

一、剧本的前置知识点

1、主机清单

ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成
一般主机名使用FQDN

vi /etc/ansible/hosts
[webserver]              #使用方括号设置组名
www1.example.org         #定义被监控主机,这边可以是主机名也可以是IP地址
www2.example.org:2222    #冒号后定义远程连接端口,默认是ssh的22端口

如果是名称类似的主机,可以使用列表的方式标识各个主机

[webserver]
//[01:50]表示匹配从01到50,后面跟着内置变量,这里定义了ssh的访问的用户名和密码,用于免交互登录
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=abc123[dbbservers]
//[a:f]表示支持匹配a到f
db-[a:f].example.org

Inventory中的变量

主机变量

[webserver]
//定义变量http_port(开放的端口信息)和maxRequestsChild(最大进程数)
www1.magedu.com http_port=80 maxRequestsChild=808
www2.magedu.com http_port=8080 maxRequestsChild=909

组变量

[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org

组嵌套

[apache]
http1.example.org
http2.example.org[nginx]
ngx1.example.org
ngx2.example.org//定义一个组名,将刚才定义的两个组名放入,即webservers组包含apache组和nginx组的主机
[webservers]
apache
nginx

inventory变量参数

  • ansible_ssh_host #将要连接的远程主机名,与你想要设定的主机的别名不同的话,可以通过此变量设置。
    ansible_ssh_port #ssh 端口号.如果不是默认的端口号,通过此变量设置。
    ansible_ssh_user #默认的 ssh 用户名。
    ansible_ssh_pass #ssh 密码(这种方式并不安全,强烈建议使用 --ask-pass 或SSH密钥)。
    ansible_ssh_private_key_file #ssh使用的私钥文件,适用于有多个密钥,但你不想使用 SSH 代理的情况。
    ansible_ssh_common_args #此设置附加到 sftp , scp 和ssh的缺省命令行。
    ansible_sftp_extra_args #此设置附加到默认 sftp 命令行。
    ansible_scp_extra_args #此设置附加到默认 scp 命令行。
    ansible_ssh_extra_args #此设置附加到默认 ssh 命令行。
    ansible_ssh_pipelining #确定是否使用SSH管道。这可以覆 ansible.cfg 中的设置。
    ansible_shell_type #目标系统的shell类型。默认情况下,命令的执行使用 ’ sh ’ 语法,可设置为 ’ csh ’ 或 ’ fish '。
    ansible_python_interpreter #目标主机的 python路径.适用于的情况: 系统中有多个 Python , 或者命令路径不是"/usr/bin/python",比如 BSD, 或者 /usr/bin/python
    ansible_
    _interpreter #这里的" * "可以是 ruby 或 perl 或其他语言的解释器,作用和ansible_python_interpreter 类似。
    ansible_shell_executable #这将设置 ansibie 控制器将在目标机器上使用的 shell ,覆盖 ansible.cfg 中的配置,默认为 /bin/sh。

2、YAML

YAML:另一种标记语言。是用来写配置文件的语言,非常简洁和强大。
YAML语法和其他语言类似,也可以表达散列表、标量等数据结构。
结构通过空格来展示;序列里配置项通过-来代表;Map里键值用:来分隔;YAML的扩展名为yaml

(1)基本语法规则

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

(2)YAML支持的数据结构

对象
键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)

例如: name (键): Example(值)类class:(物品)对象1:(桌子)属性(名称,长、宽、高等)方法(动词,放东西)...对象2对象3

数组
一组按次序排列的值,又称为序列(sequence)/列表(list)

例如:-Apple-Orange

纯量
单个的、不可再分的值

例如:number: 12.30sure: true

二、Ansible的脚本------playbook

通过task调用ansible的模板将多个play组织在一个playbook中运行。

1、playbooks的组成部分

  • Tasks:任务,即调用模块完成的某操作;原理和事务一样,要么一起执行,要么一起不执行。
  • Variables:变量;声明变量的三个场景:hosts文件中定义、剧本中定义、在命令中加上-e定义。
  • Templates:模板;定义模板同一格式,解决每个服务可能因格式不一样而不兼容的问题。
  • Handlers:处理器,当某条件满足时,触发执行的操作。
  • Roles:角色;将任务分类执行,彼此之间互不干扰。

我们先看一个playbook的示例简单了解一下

vim httpd.yaml
- hosts: webservervars:http_port: 80max_clients: 200user: roottasks:- name: ensure apache is at the latest versionyum: pkg=httpd state=latest- name: write the apache config filetemplate: src=/root/test/httpd.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart apache- name: ensure apache is runningservice: name=httpd state=startedhandlers:- name: restart apacheservice: name=httpd state=restarted#---------------------playbook解释------------------------
- hosts: webserver      //定义的主机组,即应用的主机vars:                 //定义变量http_port: 80max_clients: 200user: root            //指定用户执行任务tasks:                //执行的任务- name: ensure apache is at the latest version   //自定义输出内容,任务名称yum: pkg=httpd state=latest        //yum模块:指定软件包和版本参数;即使用yum安装最新版的httpd- name: write the apache config filetemplate: src=/srv/httpd.j2 dest=/etc/httpd.conf  //定义一个httpd的模板(在管理端自己创建)notify:     //调用下面的操作- restart apache    //操作的名字,在handlers下定义- name: ensure apache is runningservice: name=httpd state=started  //输出httpd状态handlers:               //处理器- name: restart apache          //被调用的操作名字service: name=httpd state=restarted  //重启httpd服务

2、执行playbook

格式:
ansible-playbook [yaml文件名]
例如:ansible-playbook ping.yml
参数:-k(–ask-pass) 用来交互输入ssh密码-K(-ask-become-pass) 用来交互输入sudo密码-u 指定用户补充命令:
ansible-playbook XXXX.yaml --syntax-check   #检查yaml文件的语法是否正确
ansible-playbook XXXX.yaml --list-task      #检查tasks任务
ansible-playbook XXXX.yaml --list-hosts     #检查生效的主机
ansible-playbook XXXX.yaml --start-at-task='ensure apache is at the latest version'  #指定从某个task开始运行

3、hosts和users介绍

  • hosts: webserver #指定主机组,可以是一个或多个组。
    remote_user: root #指定远程主机执行的用户名

还可以为每个任务定义远程执行用户:

vim mysql.yaml
- hosts: mysqlremote_user: roottasks:- name: test connectionping:remote_user: root

执行playbook时:ansible-playbook mysql.yaml -k

指定远程主机sudo切换用户:

vim mysql.yaml
- hosts: mysqlremote_user: roottasks:- name: test connectionping:remote_user: fff



一个yaml文件中可以写多个hosts,定义多个主机组

vim hosts.yaml
- hosts: webserverremote_user: roottasks:- name: create nginx groupgroup: name=nginx system=yes gid=208- name: create nginx useruser: name=nginx uid=208 group=nginx system=yes
- hosts: mysqlremote_user: roottasks:- name: copy file to mysqlcopy: src=/etc/inittab dest=/opt/inittab.back


4、tasks列表和action

  • Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。

    • 在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。
    • Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
  • 每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
  • 定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
  • ansible的自带模块中,command模块和shell模块无需使用key=value格式
vim error.yaml
- hosts: webserverremote_user: roottasks:- name: disable selinuxcommand: '/sbin/setenforce 0'- name: make sure apache is runningservice: name=httpd state=started

只要执行命令的返回值不为0,就会报错,tasks停止
修改如下

- hosts: webserverremote_user: roottasks:- name: disable selinuxcommand: '/sbin/setenforce 0'ignore_errors: True #忽略错误,强制返回成功- name: make sure apache is runningservice: name=httpd state=started

5、Handlers介绍

Handlers也是一些task的列表,和一般的task并没有什么区别。
是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

vim handler.yaml
- hosts: webserverremote_user: roottasks:- name: install httpd packageyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:- name: restart httpdservice: name=httpd state=restarted

6、playbook使用变量

(1)通过ansible命令传递

vim test1.yml
- hosts: mysqlremote_user: rootvars:- user:tasks:- name: add new useruser: name={{user}}

然后执行命令: ansible-playbook test1.yml -e “user=lisi”
可以执行命令查看:ansible mysql -m shell -a ‘cat /etc/shadow |grep “lisi”’

(2)直接在yaml中定义变量

vim test2.yml
- hosts: webserverremote_user: rootvars:package: httpdservice: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: install configuration file for httpdcopy: src=/root/handler/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpd serviceservice: enabled=true name={{service}} state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted

(3)直接引用一些变量

引用ansible的固定变量

vim test3.yml
- hosts: mysqlremote_user: roottasks:- name: copy filecopy: content="{{ansible_all_ipv4_addresses}}," dest=/opt/vars.txt

执行命令:ansible-playbook test3.yml
查看vars.txt文件内容:ansible mysql -a ‘cat /opt/vars.txt’

引用主机变量

vim /etc/ansible/hosts
在mysql组的主机后面添加如下
[mysql]
192.168.10.17 testvar="10.15" #定义testvar变量的值为163.200vim test3.yml #添加{{testvar}}主机变量
- hosts: mysqlremote_user: roottasks:- name: copy filecopy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt

执行命令:ansible-playbook test3.yml
查看vars.txt文件内容:ansible mysql -a ‘cat /opt/vars.txt’

7、条件测试

如果需要根据变量、facts(setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用when子句。
在task后添加when子句即可使用条件测试:when子句支持jinjia2表达式或语法,例如:

vim when.yml
- hosts: mysqlremote_user: roottasks:- name: "shutdown CentOS"command: /sbin/shutdown -h nowwhen: ansible_distribution == "CentOS"


多条件判断

vim when.yml
- hosts: mysqlremote_user: roottasks:- name: "shutdown CentOS 7 systems"command: /sbin/shutdown -r nowwhen:- ansible_distribution == "CentOS"- ansible_distribution_major_version == "7"


组条件判断

vim when.yml
- hosts: mysqlremote_user: roottasks:- name: "shutdown CentOS 7 and Debian 7 systems"command: /sbin/shutdown -r nowwhen: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7") or(ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

8、迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。例如:

vim install.yaml
- hosts: webserverremote_user: roottasks:- name:command: rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm- name: "Install Packages"yum: name={{ item }}with_items:- httpd- mysql-server- php

Ansible的脚本(playbook剧本)相关推荐

  1. playbook剧本示例

    自动化运维 Ansible的脚本---playbook剧本示例 自动化运维 示例 编写httpd模块 编写mysql模块 编写php模块 编写roles示例 示例 mkdir /etc/ansible ...

  2. Ansible概述与部署及playbook剧本编写

    Ansible自动化运维管理工具的概述与部署 文章目录 Ansible自动化运维管理工具的概述与部署 一.Ansible简介 1.Ansible概述 2.ansible环境安装部署 3.ansible ...

  3. ansible———playbook剧本

    ansible--playbook剧本 文章目录 ansible--playbook剧本 一.主机清单 二.Yaml文件 三.playbook剧本 四.Handlers介绍 五.条件测试 一.主机清单 ...

  4. Ansible Playbook剧本

    编写Ansible Playbook剧本,使用Playbook完成自动化操作 熟悉Playbook语法格式 编写Playbook管理系统账户 编写Playbook管理逻辑卷 编写Playbook管理软 ...

  5. 【Ansible】Playbook剧本

    Playbook剧本 一.剧本三要素 剧本 playbook 1.场地 1.主机组hosts 2.演员 2.执行用户 3.故事情节 3.执行的任务(调用ansible模块) 二.剧本组成 playbo ...

  6. Ansible自动化运维工具之playbook剧本编写

    内容预知 目录 内容预知 1.playbook的相关知识 1.1 playbook 的简介 1.2 playbook的 各部分组成 2. 基础的playbook剧本编写实例 实例1:playbook编 ...

  7. SUDO提权-Ansible配置-变量-Playbook应用案例

    返回 文章目录 1 案例1:配置sudo权限 1.1 问题 1.2 方案 步骤一:配置sudo提权 2 案例2:修改Ansible配置 2.1 问题 步骤一:配置普通用户远程管理其他主机 1)修改主配 ...

  8. 使用Ansible中的playbook

    使用Ansible中的playbook 1 playbook的功能 2 YMAL 2.1 简介 2.2 特点 2.3 语法简介 2.4 YAML列表 2.5 YAML的字典 3 playbook执行命 ...

  9. Playbook剧本

    `|`和>的区别:|它保留换行符,>把多行合并为一行 Playbook剧本 常用于复杂任务的管理,以及管理经常要完成的任务 playbook也是通过模块和它的参数,在特定主机上执行任务 p ...

最新文章

  1. 谷歌利用人工智能设计的芯片揭示了智能的本质
  2. java内部类和匿名类
  3. 清除 Xcode 项目缓存
  4. 使用libsvm实现归一化
  5. 项目托管 网站 小记
  6. 零基础学Java的书籍,值得收藏
  7. ebay php 商品添加多运输,eBay如何设置物流方式
  8. Guns 代码生成演示_入门试炼02
  9. springboot整合sharding-jdbc
  10. 修改Azure Website默认时区
  11. 简单ajax跨域请求
  12. UUIDGenerator
  13. 单片机常用C代码汇总
  14. Linux-Udev机制
  15. 学习笔记-DataFrame求平均数,求众数
  16. Mac安装Mysql卡在最后一步
  17. 优达棒球赛数据分析项目
  18. 《深入理解Java虚拟机》-周志明 -第3版-第一章摘记
  19. 蔚来汽车笔试题-20210718
  20. linux c strtol 函数解析

热门文章

  1. 2022河南联赛第(二)场:河南理工大学 ---复盘
  2. uniapp获取微信头像和昵称
  3. 狂神说Linux笔记
  4. _EPROCESS结构简单了解!
  5. SQLException: The server time zone value ‘EDT‘ is unrecognized or represents more than one time zone
  6. Flutter 开发错误集合二
  7. 计算机修图教程,电脑修图太复杂 3步教你学会用手机做肤色后期
  8. 草履虫纳米机器人_《Nature》:草履虫大小的微型机器人:由激光驱动,未来可用于显微外科手术!...
  9. ios 微信逆向部分
  10. 基于51单片机的波形发生器(四种波形)(毕业设计资料)