1.playbook练习
安装Apache并修改监听端口为8080
修改ServerName配置,执行apachectl -t命令不报错
设置默认主页hello world
启动服务并设开机自启
 
***********
json数据格式:
{} 集合,里面存放多组键值对
[ ] 数组,存放多个值,可以是集合
两者可以互相嵌套
{ "all":[
          { "a1": "A1","a2": "A2" },
          { "b1": "B1","b2": "B2" },
          { "c1": "C1","c2": "C2" }
           ]
}
 
************
 
YAML数据格式:
--- ,表示一个文件的开始
数组:-空格
键值对::空格
#表示注释
不要用tab键,分隔必须是英文符号
"all":
   -
     "a1": "A1"
     "a2": "A2"
   -
     "b1": "B1"
     "b2": "B2"
   -
     "c1": "C1"
     "c2": "C2"
 
************
 
Jinja2语法规则
{{ 表达式 }}
{% 控制语句 %}
{# 注释 #}
 
调用变量 {{var}}
计算     {{2+3}}
判断     {{ 1 in [1,2,3]}}
 
{% if   "name" == "aa" %}
   "aa"
{% elif "name" == "bb" %}
   "bb"
    {% for "BB" in [AA,BB,CC] %}
       {{ do method }}
    {% endfor %}
{%  else %}
   "cc"
{% endif %}
 
对abc哈希加密
{{ "abc" | hash('md5') }}
 
把一个列表用逗号连接起来
{{ list | join(',') }}
 
************
 
playbook构成
Target   远程主机组
Variable 定义playbook运行时需要使用的变量
Tasks    定义将要在远程主机上执行的任务列表(命令的集合)
Handler  定义Task执行任务完成以后需要调用的任务
红色表示失败,绿色表示成功
主机与主机之间运行命令是并发的
命令是按顺序执行的
 
---
- hosts: all
  remote_user: root
  tasks:(此处有空格)
    - ping:(此处有空格)
 
ansible ~]# ansible-playbook ping.yml -f 5
 -空格ping:空格参数
-f          并发进程数量,默认是5
hosts       一个或多个组或主机的patterns,以逗号为分隔符
remote_user 账户名
每个task命令批量执行于hosts里所有主机,所有task依次执行
 
************
 
1.1 playbook的ping脚本检测
 
ansible]# vim ping.yml
---
- hosts: all
  remote_user: root
  tasks:
     - ping:
ansible]# ansible-playbook ping.yml  //输出结果
 
注意:如果检测的时候出错,会在当前的目录生成一个新的文件(以.retry结尾),可以去这个文件里面看是哪个主机的错
 
1.2 用playbook安装Apache,修改端口,配置ServerName,修改主页,设置开机自启
 
[root@ansible ansible]# vim http.yml
---
- hosts: cache
  remote_user: root
  tasks:
    - name: install one specific version of Apache
      yum:
        name: httpd        //安装Apache
        state: installed
    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        line: 'Listen 8080'        //修改端口为8080
    - replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^#(ServerName).*'        //配置ServerName
        replace: '\1 localhost'
    - service:
        name: httpd
        enabled: yes        //开机自启
        state: restarted
    - copy:
        src: /root/index.html        //修改主页,可以自己写个页面
        dest: /var/www/html/index.html
 
ansible]# ansible-playbook http.yml 
ansible]# curl 192.168.1.56:8080
hello world
 
ansible]# ssh cache
cache ~]# apachectl -t
Syntax OK
 
2. 变量练习
 
练习使用user模块添加用户
练习使用变量简化task,让play通用性更强
练习使用过滤器
 
2.1 用user模块添加用户,并修改密码
ansible]# vim user.yml
---
- hosts: cache
  remote_user: root
  vars:
    username: lisi
  tasks:
    - name: create user "{{username}}"
      user: group=wheel uid=1000 name={{username}}
    - shell: echo 123456 | passwd --stdin {{username}}
    - shell: chage -d 0 {{username}}
ansible]# ansible-playbook user.yml   //执行结果
 
2.2 变量过滤器,创建一个用户,设置密码
ansible模块添加用户,如果用户不存在,则自动创建用户,如果用户存在,则执行下一步。
ansible]# vim user1.yml
---
- hosts: cache
  remote_user: root
  tasks:
   - user:
       name: zhangsan
       group: root
       password: "{{'123456' | password_hash('sha512')}}"
   - shell: chage -d 0 zhangsan
 
password_hash 过滤器 {{调用变量|过滤器}}
变量在vars:下面定义
       变量名:变量值
 
ansible]# ansible-playbook user1.yml 
 
2.3 定义一个变量创建用户,设置密码
ansible]# vim user2.yml
---
- hosts: cache
  remote_user: root
  vars:
    user: wangwu
  tasks:
    - user:
        name: "{{user}}"
        group: root
        password: "{{'123456' | password_hash('sha512')}}"
    - shell: chage -d 0 "{{user}}"
ansible]# ansible-playbook user2.yml
 
3. handlers练习(定义触发脚本)
安装Apache软件
配置文件,重新载入配置文件让服务生效
使用handlers来实现
 
3.1 error
 
playbook从上往下顺序执行,若报错,后面的命令不会在执行,若想解决有两种方法:
1)当返回值为假时,显示true: - shell: setenforce 0 || true
ansible]# vim user4.yml
---
- hosts: cache
  remote_user: root
  vars:
    user: bb
  tasks:
   - shell: setenforce 0 || true
   - user:
       name: "{{user}}"
       group: root
       password: "{{'123456' | password_hash('sha512')}}"
   - shell: chage -d 0 "{{user}}"
作用:报错不提示
ansible]# ansible-playbook user4.yml 
 
2) 忽略:ignoring_errors: True
(推荐使用这个,会有报错信息,告诉你错误忽略,继续执行下面的命令)
ansible]# vim user5.yml
---
- hosts: cache
  remote_user: root
  vars:
    user: bb
  tasks:
   - shell: setenforce 0 
     ignore_errors: True
   - user:
       name: "{{user}}"
       group: root
       password: "{{'123456' | password_hash('sha512')}}"
   - shell: chage -d 0 "{{user}}"
ansible]# ansible-playbook user5.yml 
...ignoring...
 
3.2  handlers
关注的资源发生变化时采取的操作(有所变化,就执行handlsers的操作)
1) 使用handlers来配置文件,重新载入配置文件让服务生效
ansible]# vim adhttp.yml
---
- hosts: cache
  remote_user: root
  tasks:
    - copy:
        src: /root/httpd.conf
        dest:  /etc/httpd/conf/httpd.conf
        owner: root
        group: root
        mode: 0644
      notify:
        - restart httpd
  handlers:
     - name: restart httpd
       service: name=httpd state=restarted
 
ansible]# ansible-playbook adhttp.yml 
ansible]# ssh cache apachectl -t
Syntax OK
ansible]# curl 192.168.1.56:8080
hello world
 
2)使用脚本调用变量更改服务
ansible]# vim adhttp2.yml
---
- hosts: cache
  remote_user: root
  vars:
    server: httpd
  tasks:
    - copy:
        src: /root/httpd.conf
        dest:  /etc/httpd/conf/httpd.conf
        owner: root
        group: root
        mode: 0644
      notify:
        - restart "{{server}}"
  handlers:
     - name: restart "{{server}}"
       service: name=httpd state=restarted
ansible]# ansible-playbook adhttp2.yml
 
4.编写playbook
把所有监听端口是8080的Apache服务全部停止
 
4.1 把监听端口是8080的Apache服务全部停止
]# vim ad.yml
---
- hosts: cache
  remote_user: root
  tasks:
    - shell: netstat -atunlp  | awk  '{print $4}'| awk '-F:' '{print $2}'
      register: result
    - service:
        name: httpd
        state: stopped
 
ansible]# ansible-playbook ad.yml
 
4.2 when条件判断
1)当系统负载超过0.7时,则关掉httpd
ansible]# vim when.yml
---
- hosts: cache
  remote_user: root
  tasks:
    - shell: uptime | awk '{printf("%.2f",$(NF-2))}'
      register: result
    - service:
        name: httpd
        state: stopped
      when: result.stdout|float < 0.7 
       (此处写<,方便查看效果)
 
ansible]# ansible-playbook when.yml 
 
4.3 with_items标准循环
 
1)为不同用户定义不同组
(批量创建用户,分别设置用户组)
ansible]# vim add.yml
---
- hosts: web2
  remote_user: root
  tasks:
    - user:
        name: "{{item.name}}"
        group: "{{item.group}}"
        password: "{{'123456'|password_hash('sha512')}}"
      with_items:
        - {name: "aa", group: "users"}
        - {name: "bb", group: "mail" }
        - {name: "cc", group: "wheel"}
        - {name: "dd", group: "root" }
 
ansible]# ansible-playbook add.yml 
 
2) 嵌套循环,循环添加多用户
ansible]# vim add1.yml
---
- hosts: web2
  remote_user: root
  vars:
    un: [a, b, c]
    id: [1, 2, 3]
  tasks:
    - name: add users
      shell: echo {{item}}
      with_nested:
        - "{{un}}"
        - "{{id}}"
 
ansible]# ansible-playbook add1.yml 
*
changed: [web2] => (item=[u'a', 1])
changed: [web2] => (item=[u'a', 2])
changed: [web2] => (item=[u'a', 3])
changed: [web2] => (item=[u'b', 1])
changed: [web2] => (item=[u'b', 2])
changed: [web2] => (item=[u'b', 3])
changed: [web2] => (item=[u'c', 1])
changed: [web2] => (item=[u'c', 2])
changed: [web2] => (item=[u'c', 3])
 
4.4 tags给指定的任务定义一个调用标识
以后不用重复整个过程,只需要执行tags标签的部分
 
1)tags 样例
ansible]# vim adhttp.yml
---
- hosts: cache
  remote_user: root
  tasks:
    - copy:
        src: /root/httpd.conf
        dest:  /etc/httpd/conf/httpd.conf
        owner: root
        group: root
        mode: 0644
      tags: config_httpd
      notify:
        - restart httpd
  handlers:
     - name: restart httpd
       service: name=httpd state=restarted
 
2)调用方式
ansible]# ansible-playbook adhttp.yml --tags=config_httpd
 
3)include and roles
在编写playbook的时候随着项目越来越大,playbook越来越复杂。可以把一些play、task 或 handler放到其他文件中,通过包含进来是一个不错的选择
roles像是加强版的include,它可以引入一个项目的文件和目录
一般所需的目录层级有
vars:变量层
tasks:任务层
handlers:触发条件
files:文件
template:模板
default:默认,优先级最低
...
tasks:
   - include: tasks/setup.yml
   - include: tasks/users.yml user=plj 
//users.yml 中可以通过{{ user }}来使用这些变量
handlers:
  - include: handlers/handlers.yml
 
4.5 debug检测
ansible]# ansible-playbook --syntax-check http.yml  //检测语法
playbook: http.yml
ansible]# ansible-playbook -C http.yml  //测试运行
ansible]# ansible-playbook http.yml  --list-tasks  
 
ansible]# vim debug.yml
---
- hosts: cache
  remote_user: root
  tasks:
    - shell: uptime |awk '{printf("%f\n",$(NF-2))}'
      register: result
    - shell: touch /tmp/isreboot
      when: result.stdout|float > 0.5
    - name: Show debug info
      debug: var=result
ansible]# ansible-playbook debug.yml  //运行
...
    "result": {
        "changed": true, 
        "cmd": "uptime |awk '{printf(\"%f\\n\",$(NF-2))}'", 
        "delta": "0:00:00.004577", 
        "end": "2019-02-27 16:58:50.151040", 
        "failed": false, 
        "rc": 0, 
        "start": "2019-02-27 16:58:50.146463", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "0.080000", 
        "stdout_lines": [
            "0.080000"
 
########################
知识点整理:

01:ansible的七种武器:
a:ansble 执行临时性工作
b:ansible-doc 文档
c:ansible-console 用户交互式工具(类似shell)
d:ansible-galaxy 从github上下载管理Roles的工具(类似Python的pip,下载别人的项目,回来自己修改)
e:ansible-playbook 任务集(命令集合)
f:ansible-vault 配置文件加密
g:ansible-pull/push 大批量机器配置

02:json YAML Jinja2 playbook
json数据格式:
{} 集合,里面存放多组键值对
[ ] 数组,存放多个值,可以是集合
两者可以互相嵌套
{ "all":[
{ "a1": "A1","a2": "A2" },
{ "b1": "B1","b2": "B2" },
{ "c1": "C1","c2": "C2" }
]
}

YAML数据格式:
--- ,表示一个文件的开始
数组:-空格
键值对::空格
#表示注释
不要用tab键,分隔必须是英文符号
"all":
-
"a1": "A1"
"a2": "A2"
-
"b1": "B1"
"b2": "B2"
-
"c1": "C1"
"c2": "C2"

Jinja2语法规则
基于Python的模板引擎,包含变量和表达是两部分,两者在模板求值时会被替换为值,模板中还有标签,控制模板的逻辑。
Playbook的模板使用Python的Jinjia2模块来处理。
{{ 表达式 }}
{% 控制语句 %}
{# 注释 #}

调用变量 {{var}}
计算 {{2+3}}
判断 {{ 1 in [1,2,3]}}

{% if "name" == "aa" %}
"aa"
{% elif "name" == "bb" %}
"bb"
{% for "BB" in [AA,BB,CC] %}
{{ do method }}
{% endfor %}
{% else %}
"cc"
{% endif %}

对abc哈希加密
{{ "abc" | hash('md5') }}

把一个列表用逗号连接起来
{{ list | join(',') }}

playbook构成
由YAML语言编写,支持YAML脚本
Target 远程主机组
Variable 定义playbook运行时需要使用的变量
Tasks 定义将要在远程主机上执行的任务列表(命令的集合)
Handler 定义Task执行任务完成以后需要调用的任务
红色表示失败,绿色表示成功
主机与主机之间运行命令是并发的
命令是按顺序执行的

---
- hosts: all
remote_user: root
tasks:(此处有空格)
- ping:(此处有空格)

ansible ~]# ansible-playbook ping.yml -f 5
-空格ping:空格参数
-f 并发进程数量,默认是5
hosts 一个或多个组或主机的patterns,以逗号为分隔符
remote_user 账户名
每个task命令批量执行于hosts里所有主机,所有task依次执行

触发器:跟tasks平齐 如过变标签里执行了某个task,则执行某个handler,notify调用此handler的name为触发。

########################

五十六. playbook基础 、 playbook进阶的更多相关文章

  1. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  2. “全栈2019”Java第五十六章:多态与字段详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  4. 十六. Python基础(16)--内置函数-2

    十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...

  5. 第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

    第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点 1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题

  6. 《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  7. Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之七(五十六)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  8. OpenCV开发笔记(五十六):红胖子8分钟带你深入了解多种图形拟合逼近轮廓(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  9. FastAPI 学习之路(五十六)将token存放在redis

    在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,Fa ...

随机推荐

  1. Python开发【第三章】:函数介绍

    一. 函数介绍 1.函数是什么? 在学习函数之前,一直遵循面向过程编程,即根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复 ...

  2. 一文搞懂嵌入式uboot、kernel、文件系统的关系

    总览: 在linux系统软件架构可以分为4个层次(从低到高分别为):   1.引导加载程序         引导加载程序(Bootloader)是固化在硬件Flash中的一段引导代码,用于完成硬件的一 ...

  3. C# xml序列化 datatime字段

    [XmlIgnore] public DateTime ApplicationDatetime { get; set; } [XmlElement("ApplicationDatetime& ...

  4. (二)CXF之用CXF官方工具生成客户端Client

    一.CXF工具的下载与使用 登录CXF官网:http://cxf.apache.org/download.html 下载,本系列使用的是3.1.5版本: 添加path环境变量 二.案例 2.1 发布w ...

  5. (十)SpringBoot之web 应用开发-Servlets, Filters, listeners

    一.需求 Web 开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet. FilterListene 二.案例 2.1 通过注册 ServletRegistr ...

  6. 使用Canvas压缩图片

    讲干货,不啰嗦,当涉及对图片有质量压缩要求的时候,可以使用Canvas实现图片压缩. 步骤: 1.获取img元素,既要压缩的图片 2.创建canvas对象 3.使用canvas的drawImage方法 ...

  7. Android开发中常见问题分析及解决

    最近公司有新的业务需求,需要开发一款APP,因为我开发过Android APP(我想告诉他们,那是4年前的事了,嘤嘤嘤),就把开发任务交给我了,当然也不是我一个人啦,让我组开发小组,说白了,就是让我来 ...

  8. K2 BPM_快消零售连锁行业门店选址解决方案_十年专注业务流程管理系统

    >>>业务流程管理软件选型攻略  快消零售连锁行业门店选址解决方案   业内有句名言:“门店最重要的是什么?第一是选址,第二是选址,第三还是选址” 选址是一个很复杂的综合性商业决策过 ...

  9. 2019 GIAC-全球互联网架构大会课件

    百度云:https://pan.baidu.com/s/1Lt40UTP3hCIVS7LhPl2bKw密码:ovrh

  10. mysql常用的存储引擎,MyISAM和InnoDB的对比

    Mysql有多种存储引擎,最常用的有MyISAM和InnoDB这两种,每一种类型的存储引擎都有自已的特点,可以结合项目中数据的使用场景来进行了哪种存储引擎合适. 1:查看mysql数据库支持的存储引擎 ...