Ansible playbook基础

playbook基础
基础知识
playbook
ansible七种武器
JSON简介
YAML简介
Jinja2模版简介
playbook是什么
playbook语法基础

playbook基础

基础知识

ansible七种武器

  • 第一种武器
ansible命令,用于执行临时性的工作,必须掌握
  • 第二种武器
ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌握
  • 第三种武器
ansible-console:是ansible为用户提供的交互式工具用户可以在ansible-console虚拟出来的终端上像Shell一样使用ansible内置的各种命令 ,这为 习惯使用Shell交互方式的用户提供了良好的使用体验
  • 第四种武器
ansible-galaxy从github.上下载管理Roles的一款工具与python的pip类似
  • 第五种武器
ansible- playbook是日常应用中使用频率最高的命令,工作机制:通过读取先编写好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务集 ,必须掌握
  • 第六种武器
ansible-vault主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看, 可用它加密/解密这个文件
  • 第七种武器
1.ansible-pull
2.ansible有两种工作模式pull/push , 默认使用push模式工作, pull和push.工作模式机制刚好相反
3.适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间
4.通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求

JSON简介

  • JSON是什么
JSON是JavaScript对象表示法,它是一 种基于文本独立于语言的轻量级数据交换格式
JSON中的分隔符限于单引号" ' ", 小括号" ()"、中括号"[]”、大括号"{}"、冒号":"和逗号"
  • JSON特性
JSON是纯文本
JSON具有"自我描述性" (人类可读)
JSON具有层级结构(值中存在值)
JSON可通过JavaScript进行解析
  • JSON语法规则
数据在名称/值对中
数据由逗号分隔
大括号保存对象
中括号保存数组
  • JSON数据的书写格式是: 名称/值对
名称/值对包括字段名称(在双引号中) ,后面写个冒号,然后是值,例如:
"诗仙”: "李白"
  • JSON语法规则之数组
    { "诗人":
    	["李白", "杜甫","白居易""李贺"]
    }
  • 复合复杂类型
    {"诗人":
        [{"李白":"诗仙""年代":"唐"}
        {"杜甫":"诗圣""年代":"唐"}
        {"白居易":"诗魔""年代":"唐"}
        {"李贺":" 诗鬼""年代":"唐"}
        ]
    }

YAML简介

  • YAML简介
是一个可读性高,用来表达数据序列的格式
YAML ( YAML Ain't Markup Language )
YAML参考了多种语言,: C语言、Python、 Perl等, 并从XML、电子邮件的数据格式中获得灵感, Clark Evans在2001年首次发表了这种语言,目前已有数种编程语言或脚本语言支持这种语言
  • YAML基础语法
YAML的结构通过空格来展示
数组使用"-"来表示
YAML使用一个固定的缩进风格表示数据层级结构关系
一般每个缩进级别由两个以上空格组成
#表示注释
  • 注意:
不要使用tab ,缩进是初学者容易出错的地方之一
同一层级缩进必须对齐
  • YAML的键值表示方法
采用冒号分隔
:后面必须有一个空格
YAML键值对例子
    "诗仙”: "李白”

        或
            "李白":
                "诗仙”
  • 复杂YAML的键值对嵌套
    "诗人":
        "李白": "诗仙""诗人":
        "李白":
        	"诗仙”
    数组
["李白""杜甫""白居易""李贺"]
  • YAML数组表示方法
使用一个短横杠加一个空格
YAML数组例子
  - "李白"
  - "杜甫"
  - "白居易"
  - "李贺"
哈希数组复合表达式
	"诗人":
      - "李白"
      - "杜甫" 
      - "白居易"
      - "李贺"
高级复合表达式
	"诗人":
	  - 
        "李白": "诗仙"
        "年代": "唐"
      -
        "杜甫": "诗圣"
        "年代": "唐"
      -
        "白居易": "诗魔”
        "年代": "唐"
      -
        "李贺": "诗鬼”
        "年代": "唐"

Jinja2模版简介

  • Jinja2是什么
Jinja2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求值时会被替换为值,模板中还有标签,控制模板的逻辑
  • 为什么要学习Jinja2模版
因为playbook的模板使用Python的Jinja2模块来处理
  • Jinja2模版基本语法
模板的表达式都是包含在分隔符"{{ }}" 内的
控制语句都是包含在分隔符"{% %}" 内的
模板支持注释,都是包含在分隔符"{# #}",支持块注释
调用变量
	{{varname}}
计算
	{{2+3}}
判断
	{{1 in [1,2,3]}}
  • Jinja2模版控制语句
{% if name == '诗仙' %}
	李白
{% elif name == '诗圣' %}
	杜甫
{% elif name == '诗魔' %}
	白居易
{%else%}
	李贺
{% endif %}
  • Jinja2模版控制语句
{% if name == ...%}
.......
{% elif name == '于谦' %}
	{% for method in [抽烟,喝酒,烫头] %}
		{{do method}}
{% endfor %}
.......
{% endif %}
  • Jinja2过滤器
变量可以通过过滤器修改。过滤器与变量用管道符号(I )分割,也可以用圆括号传递可选参数,多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入
  • 例如
把一个列表用逗号连接起来: {{ listljoin(, ') }}
过滤器这里不再 ---- 列举,需要的可以查询在线文档http://docsjinkan.org/docs/jinja2/templates.html#builtin-filters 

playbook

playbook是什么

  • playbook是什么
1.playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks ,可以让远端主机达到预期状态
2.也可以说, playbook字面意思即剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情

playbook语法基础

  • playbook语法格式
1.playbook由YAML语言编写,遵循YAML标准
2.在同一行中, #之后的内容表示注释
3.同一个列表中的元素应该保持相同的缩进
4.playbook由一个或多个play组成
5.play中hosts , variables ,roles,tasks等对象的表示方法都是键值中间以": "分隔表示
6.YAML还有一个小的怪癖,它的文件开始行都应该是 -- 这是YAML格式的一部分,表明一个文件的开始
playbook
	hosts	定义主机的集合
	vars	定义变量表达式
	tasks	定义命令的集合
  • playbook构成
1.Target :定义将要执行playbook的远程主机组
2.Variable :定义playbook运行时需要使用的变量
3.Tasks :定义将要在远程主机上执行的任务列表
4.Handler :定义task执行完成以后需要调用的任务
  • playbook执行结果
  • 使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成便于识别
绿色代表执行成功
***代表系统代表系统状态发生改变
红色代表执行失败
  • 第一个playbook
[root@web1 ~]# vim ping.yml
---                      # 第一行,表示开始
- hosts: all
  remote_user: root
  tasks:
    - ping:
#    - 模块名: 模块参数
[root@web1 ~]# ansible-playbook ping.yml

在这里插入图片描述

-f 并发进程数量,默认是5
hosts行内容是一个(多个)组或主机的patterns,以逗号为分隔符
remote_user 账户名
  • tasks
1.每一个play包含了一个task列表(任务列表)
2.一个task在其所对应的所有主机上(通过host pattern 匹配的所有主机)执行完毕之后,下一个task才会执行
3.有一点很重要,在一个play之中,所有hosts会获取相同的任务指令,这是play的一个目的所在,即将一组选出的hosts映射到task ,执行相同的操作
  • playbook执行命令

给xl主机添加用户aa ,设置默认密码123

要求第一次登录修改密码

[root@web1 ~]# ansible-doc -l | grep user

在这里插入图片描述

[root@web1 ~]# ansible-doc user

在这里插入图片描述

[root@web1 ~]# ansible-doc shell

在这里插入图片描述

[root@web1 ~]# vim user.yml
---                      # 第一行,表示开始
- hosts: xl
  remote_user: root
  tasks:
#    - 模块名: 模块参数

    - user:
        name: aa

    - name: 注释和说明!
      shell: echo 123 | passwd --stdin aa
    
    - shell: chage -d 0 aa
    # 设置它的有效期为0

---                      # 第一行,表示开始
- hosts: xl
  remote_user: root
  tasks:
#    - 模块名: 模块参数

    - name: create user aa
      user:
        name: aa

    - name: 注释和说明!
      shell: echo 123 | passwd --stdin aa
    
    - shell: chage -d 0 aa
    # 设置它的有效期为0
[root@web1 ~]# ansible-playbook user.yml

在这里插入图片描述

---                      # 第一行,表示开始
- hosts: mysql1
  remote_user: root
  tasks:
#    - 模块名: 模块参数

    - name: 创造用户名!
      user:
        name: aa

    - name: 设置密码!
      shell: echo 123 | passwd --stdin aa
    - shell: chage -d 0 aa
    # 设置它的有效期为0

在这里插入图片描述

安装Apache并修改监听端口为888
修改ServerName配置,执行apachectl -t命令不报错
设置默认主页hello ansible
启动服务并设开机自启
[root@web1 ~]# ansible-doc yum

在这里插入图片描述

[root@web1 ~]# ansible-doc lineinfile

在这里插入图片描述

[root@web1 ~]# vim index.html
hello ansible
[root@web1 ~]# ansible-doc copy

在这里插入图片描述

[root@web1 ~]# ansible-doc service

在这里插入图片描述

[root@web1 ~]# vim httpd.yml
---
- hosts: all
  remote_user: root
  tasks:

    - name: 部署Apache
      yum:
        name: httpd
        state: latest

    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        insertafter: '^#Listen '
        line: 'Listen 8080'

    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        line: 'ServerName localhost'

    - copy:
        src: /root/index.html
        dest: /var/www/html/index.html
        owner: apache
        group: apache
        mode: 0644

    - service:
        name: httpd
        state: started
        enabled: yes
[root@web1 ~]# ansible-playbook httpd.yml

在这里插入图片描述
测试

[root@web1 ~]# ssh xl
[root@xl ~]# ss -untlp | grep 8080
[root@xl ~]# apachectl -t
[root@xl ~]# curl 127.0.0.1:8080
[root@xl ~]# systemctl is-enabled httpd

在这里插入图片描述

发布了96 篇原创文章 · 获赞 100 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43395428/article/details/104886025