一、playbooks

如果用模块形式一般有幂等性,如果用shell或者command没有幂等性

playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调用

tasks:一个task相当于是一个play

varibles:变量,一定定义,多处调用

template:模板,可以区分不同主机的特点

handlers:触发器,依赖于前一个任务,前一个任务如果执行改变,那么就会触发handlers

二、yaml介绍及格式

yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。

特点:

  (1)yaml的可读性好

  (2)yaml和脚本语言的交互性好

  (3)yaml使用实现语言的数据类型

  (4)yaml有一个一致的信息模型

  (5)yaml易于实现

  (6)yaml可以基于流程来处理

  (7)yaml表达能力强,扩展性好

编写说明:

(1)缩进:yaml 的缩进要求比较严格。一定不能使用tab键

(2)冒号:每个冒号后面一定要有一个空格

注意:1. 以冒号结尾不需要空格

2. 表示文件路径的模版可以不需要空格

(3)短横线-:想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

注意:

  1. 严格控制空格编写剧本的时候

  2. 剧本编写不支持tab

书写规范注意点:

  1、脚本名:***.yml   【不是.yml也行】

  2、注释:  “#”

  3、tasks: (后不能加任何字符-可以加注释#)

  4、- name: 一个 - name: 下不能有两条功能(行)

  .每个-和:即冒号之后要有一个空格,task除外。

剧本格式:

  ---           ### 剧本的开头,可以不写

  - hosts: all     <- 处理所有服务器,找到所有服务器;  -(空格)hosts:(空格)all

  tasks:         <- 剧本所要干的事情;  (空格)(空格)task:

  - command:    (空格)(空格)-(空格)模块名称:(空格)模块中对应的功能

  测试剧本命令后面可以跟多个-v进行调试检查

常用命令:

1、对剧本语法检测

  ansible-playbook --syntax-check  /root/ansible/httpd.yaml

2、-C模拟执行剧本

  ansible-playbook  -C /root/ansible/httpd.yaml

3、执行剧本

  ansible-playbook   /root/ansible/httpd.yaml

三、ansible剧本实例

实例一:基础(编写一个rehttpd.yaml剧本)

第一步:编写剧本

[root@ren5 ~]# vim rehttpd.yaml

1 - hosts: test_ren1
2   remote_user: root
3   tasks:
4   - name: copy httpd.conf
5     copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
6   - name: restart httpd
7     service: name=httpd state=restarted

第二步:语法检测

[root@ren5 ~]# ansible-playbook --syntax-check rehttpd.yaml

playbook: rehttpd.yaml

第三步:模拟执行剧本

[root@ren5 ~]# ansible-playbook -C rehttpd.yaml

第四步:真正执行剧本

[root@ren5 ~]# ansible-playbook rehttpd.yaml

第五步:检查是否已经启动成功

[root@ren5 ~]# ansible test_ren1 -m shell -a "ss -tnl |grep 80"

实例二:打标签

-t:执行指定tag标签任务

--skip-tags:执行--skip-tags以外的任务

执行:ansible-playbook xxx.yaml -t TAG

ansible-playbook xxx.yaml --skip-tags TAG

定义带tag标签的yaml文件:

 1 - hosts: test_ren1
 2   remote_user: root
 3   tasks:
 4   - name: "touch 123.txt"
 5     shell: echo {{ ansible_all_ipv4_addresses }} > 123.txt
 6     tags:
 7     - tag1
 8   - name: "date"
 9     shell: date >> 123.txt
10     tags:
11     - tag2
12     - tag3

[root@ren5 ~]# ansible-playbook tag.yaml -t tag1             #只执行tag1标签的任务

[root@ren5 ~]# ansible all -a "cat 123.txt"           #查看文件内容

实例三:include

include:如果有多个任务要执行,写在一个yaml文件里就显得太臃肿了,而且阅读性也比较低,这个时候可以用include关键字把多个任务联合到1个yaml文件里,方便调用

比如有2个文件,a.yaml和b.yaml,那么我们可以把a.yaml,b.yaml联合到一个exec.yaml文件中执行

a.yaml的内容如下:

1 - name: "touch abc.txt"
2   shell: echo 'hello' >> abc.txt

b.yaml的内容如下:

1 - name: "touch abc.txt"
2   shell: echo 'world' >> abc.txt

exec.yaml的内容如下:

1 - hosts: test_ren1
2   remote_user: root
3   tasks:
4   - include_tasks: a.yaml
5   - include_tasks: b.yaml

[root@ren5 ~]# ansible-playbook --syntax-check exec.yaml

[root@ren5 ~]# ansible-playbook exec.yaml

[root@ren5 ~]# ansible test_ren1 -m shell -a "cat abc.txt"

实例四:剧本中使用变量

变量的引用:{{变量名}}

  一、自定义变量的实现方式:

第一种:直接写在yaml文件中,在文件中声明变量(声明变量只需要声明1次,定义变量可以定义多次)

vars和tasks同级,并要写在tasks前面

vars:

- 变量名: 变量值

vars:

- file: httpd.conf         #file就是一个变量

1 - hosts: 192.168.11.4
2   remote_user: root
3   vars:
4   - packages: tree
5   tasks:
6   - name: yum install tree
7     yum: name={{ packages }} state=present

第二种:在inventory file文件中定义

vim /etc/ansible/hosts    #定义主机组

[test_ren1:vars]

file=httpd.conf    #变量名=变量值

packages=tree             #file和packages是两个变量

第三种:执行playbook文件时候给与变量 --extra-vars

ansible-playbook test.yaml --extra-vars "touch_file=test.txt"  #--extra-vars可以出现一次或者多次

  二、注册变量

  register注册变量:把date命令输出的结果赋予给date_output

1 - hosts: 192.168.254.10
2   remote_user: root
3   tasks:
4   - name: get date
5     command: date
6     register: date_output
7   - name: echo date_output
8     shell: "echo {{date_output.stdout}}>/tmp/a.txt"

1 ---
2 - hosts: test1
3   remote_user: root
4   tasks:
5   - name: get users_info
6     command: "tail /etc/passwd"
7     register: users_info
8   - name: echo users_info
9     shell: "echo '{{ users_info.stdout }}' > /root/ab.txt"        #若变量值(变量内容)包含较多内容时,需用引号引起来

实例五、剧本中使用判断

剧本中可以使用when来进行判断

when条件语句:可以根据setup显示出客户端信息为依据来判断

1、根据系统信息判断

1 ---
2 - hosts: test_ren1
3   remote_user: root
4   tasks:
5   - name: touch file
6     shell: "touch /tmp/a.txt"
7     when: ansible_distribution=='CentOS' and ansible_distribution_major_version=='8'

2、根据域名判断

第一步:查看主机的域名(ansible_fqdn是一个变量)

[root@ren5 ~]# ansible 192.168.11.4 -m setup |grep ansible_fqdn

"ansible_fqdn": "ren4",

第二步:编写剧本

在编写剧本的时候ren4即主机名需要加上双引号或者单引号,否则会报错

1 ---
2 - hosts: all
3   tasks:
4   - name: useradd liqin
5     user: name=liqin uid=1210 system=yes
6     when: ansible_fqdn == "ren4"

第三步:语法检测

[root@ren5 ~]# ansible-playbook --syntax-check name.yaml

第四步:模拟执行

[root@ren5 ~]# ansible-playbook -C name.yaml

实例六:剧本中使用循环(迭代)

剧本中的循环使用with_items,使用item引用变量(item不可变)

变量的引用格式是 {{ item }}

第一种:

 1 ---
 2 - hosts: 192.168.11.6
 3   remote_user: root
 4   tasks:
 5   - name: add many users
 6     user: name={{ item }} state=present
 7     with_items:
 8     - user01
 9     - user02
10     - uesr11
11     - user12

第二种:Key-Value,键值对的形式实现了传多个变量的需求

1 ---
2 - hosts: 192.168.11.6
3   remote_user: root
4   tasks:
5   - name: add many users
6     user: name={{ item.name }} groups={{ item.groups }} state=present
7     with_items:
8     - { name: 'testuser1', groups: 'root' }
9     - { name: 'testuser2', groups: 'ren6' }

实例七:异常处理

ignore_errors:如果任务出错,直接跳过,不会影响其他任务

1 ---
2 - hosts: 192.168.11.4
3   remote_user: root
4   tasks:
5   - name: error
6     command: make a.txt
7     ignore_errors: yes

实例八:使用处理器(触发器)notify

handlers:如果执行的任务被改变那么会触发handlers的任务,notify下面的 - 引导的列表可以为一个或者多个,类似于流程控制语句

剧本说明:

- hosts: all 指定主机组,可以理解为这个最大,顶个写

tasks: 指定下面一系列的动作,这个是第二,需要有两个空格

- name: 指定名称,排行第三,需要有三到四个空格

yum: 模块名 排行第四,需要有四到五个空格

   notify:

- name: 和handlers下面的name名称对应

handlers:指定处理器(触发器),排行第二,需要与tasks对齐,必须写在最后

 1 ---
 2 - hosts: test_ren1
 3   remote_user: root
 4   tasks:
 5   - name: copy httpd.conf
 6     copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
 7     notify:
 8     - restarted httpd service
 9   handlers:
10   - name: restarted httpd service
11     service: name=httpd state=restarted

执行过程中间有一步RUNNING HANDLER,说明已经触发了处理器进行了重启操作

 1 ---
 2 - hosts: test1
 3   remote_user: root
 4   tasks:
 5   - name: get users_info
 6     command: "tail /etc/passwd"
 7     register: users_info
 8     notify:    #执行多次获报错,可使用触发器或者ignore_errors
 9     - echo users_info
10   handlers:
11   - name: echo users_info
12     shell: "echo '{{ users_info.stdout }}' > /root/a.txt"

实例九:模板拷贝(templates)

template,用来区分不同客户端上的特性

1.copy模块替换成template(template本身就有copy的作用,也可以识别变量)

  vim test.yaml

 1 ---
 2 - hosts: test1
 3   remote_user: root
 4   tasks:
 5   - name: copy httpd.conf
 6     template: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
 7     notify:
 8     - restarted httpd service
 9   handlers:
10   - name: restarted httpd service
11     service: name=httpd state=restarted

2.vim httpd.conf编辑要拷贝的文件,把不同的地方定义成变量形式{{变量名}}

  vim /etc/httpd/conf/httpd.conf

1 42 Listen {{ port }}

3.vim /etc/ansible/hosts 在主机后面定义变量的值:变量名=变量值

1 [test1]
2 192.168.11.5 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 port=81
3 192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 port=82

  ansible-playbook test.yaml,执行后查看结果

[root@ren6 ~]# ansible all -m shell -a "ss -tnl"
192.168.11.4 | CHANGED | rc=0 >>
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128          *:22                       *:*
LISTEN     0      100    127.0.0.1:25                       *:*
LISTEN     0      128         :::82                      :::*
LISTEN     0      128         :::22                      :::*
LISTEN     0      100        ::1:25                      :::*                  192.168.11.5 | CHANGED | rc=0 >>
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128          *:22                       *:*
LISTEN     0      100    127.0.0.1:25                       *:*
LISTEN     0      128         :::81                      :::*
LISTEN     0      128         :::22                      :::*
LISTEN     0      100        ::1:25                      :::*                  

转载于:https://www.cnblogs.com/renyz/p/11403623.html

Linux中级之ansible配置(playbook)相关推荐

  1. Linux 第60,61天 ansible的playbook

    Linux 第60,61天 ansible的playbook 时间: 20180922 时间: 20180924 目录 playbook(重点) YAML playbook 核心元素 运行playbo ...

  2. 37: sudo提权 、 Ansible配置 、 Ansible Playbook 、 Ansible进阶 、 总结和答疑

    Top NSD AUTOMATION DAY02 案例1:配置sudo权限 案例2:修改Ansible配置 案例3:Playbook应用案例 案例4:Playbook应用案例 1 案例1:配置sudo ...

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

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

  4. 教你在Linux上使用ansible写“剧本”,定义一个“剧本”模板后,让控制集群自动执行我们剧本中所写的“剧情”,几个自动化运维的简单实例

    目录 1.loop的使用 2.使用when,当条件成立时才执行任务 3.notify和handler的使用 4.tags使用 5.处理任务失败 6. 构建一个jinja2模板 7.forks和seri ...

  5. ansible之playbook角色

    ansible之playbook&角色 playbook-剧本 简介 playbook组件用法 playbook变量 playbook语句 roles-角色 简介 用法 实战 playbook ...

  6. ansible,playbook知识点复习

    ansible 基础知识: 批量管理服务器工具: 使用python编写: 基于ssh进行管理,所以不需要在被控端安装任何软件: ansible在远程管理主机时,主要通过各种模块进行操作的 对主控端的要 ...

  7. Ansible 之 Playbook详解

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

  8. Linux自学笔记——Ansible

    运维工作:系统安装(物理机.虚拟机)à 程序包安装.配置.服务启动 à 批量操作 à 程序发布 à 监控 OS Provisioning: 物理机:PXE.Cobbler 虚拟机:Image Temp ...

  9. Ansible(三)编写ansible的playbook文件(实现端口更改、远程主机信息采集、负载均衡)

    1.playbook简介 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存 ...

  10. Ansible之Playbook使用

    一.Playbook是什么 playbook-剧本(也称编排) 介绍 playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活.简单来说,playbook是一个非常简单 ...

最新文章

  1. 【MATLAB】符号数学计算(五):符号函数的替换
  2. 采样次数不同平均值不一样_不同的真石漆装饰效果也是不一样的
  3. NSArray中存的是实体时的排序
  4. 真相:Java 开发者钟爱 Kotlin 的五个原因
  5. msi笔记本u盘装linux,微星笔记本bios设置u盘启动的步骤方法详细教程 - 系统家园...
  6. 三种class反编译工具jad、frontEndPlus、jd-gui 的使用方法
  7. WSL环境下使用RV-LINK下载和调试GD32VF103程序视频教程
  8. Oracle-select...into...from语句的使用
  9. UI设计技巧|PS实现照片水彩画效果
  10. unity 物体移动方式的一些笔记
  11. android 的语言适配
  12. linux 查看java版本
  13. uniapp推送功能实现
  14. 数据结构 第七章 图(图的概念和存储)
  15. C语言基础-#include<stdio.h>
  16. 谷歌浏览器被恶意劫持解决方案
  17. 话费充值 php,首信易支付,电话费充值接口
  18. ASP.NET网站建设基本常用代码[转载]
  19. Data (Privacy) Regulation 数据隐私法规整理
  20. 什么东西比地球上的沙子还要多?

热门文章

  1. jw player 5去掉share,info,embed页面
  2. IT人:如何预防久坐伤身?
  3. 构建smaba服务器
  4. poj 1609 Tiling Up Blocks 动态规划
  5. 苹果Mac时间日程管理工具:Things 备注支持 Markdown
  6. iOS开发计算工程里面的代码行数
  7. 媒体管理工具Media Encoder 2022 for Mac
  8. php二维数组的某一字段 做分组统计
  9. linux 中软件安装的三种方法
  10. jsjquery避免报错的方法