目录

  • 一、playbook简介
  • 二、基本示例
  • 三、palybook示例
  • 1.playbook基础
  • 2.playbook执行命令
  • 3.shell加密工具shc的安装


一、playbook简介

  • Ansible实现管理的方式包括:
    Ad-Hoc: 利用ansible命令直接完成管理,主要用于临时命令使用场景。
    playbook: ansible脚本,主要用于大型项目场景,需要前期的规划,playbook是由一个或多个play组成的列表,使用YAML来编写。
  • playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
  • Playbook的功能:
    playbook 是由一个或多个play组成的列表;
    Playboot 文件使用YAML来写的;
    特点:可读性好、和脚本语言交互性号、易于实现、适用程序执行流梳理方式、可扩展性强
  • YAML语法简介:
在文件中用[---]开始
在文件中用[...]结尾
次行一般书写文件内容
缩进严格
大小写敏感
key/value可以多行书写也可一行书写,一行书写用,隔开
value可以是个字符串,也可是list
一个play需要包括name和tasks
name 是描述
tasks 是动作
一个name只能包含一个task
扩展名称yml或者yaml
  • YAML列表
[Linux,C++,Java,Python]

-Linux
-C++
-Java
-Python
  • YAML字典:存放键值
    格式一:
name:test
hosts:westos1
tasks:

格式二:

{name: "test", hosts: "westos1", tasks: ""}
  • playbook常用参数:

参数

含义

- -check/-C

检测

- -syntax-check

check language

- -list-hosts

列出hosts

- -list-tags

列出tag

- -list-tasks

列出task

- -limit

指定执行主机

-v -vv

现实过程

  • Playbook的核心组件
name	    可选,建议使用多用于说明
hosts 		受控主机列表
tasks 		任务,用与选择执行部分代码
  • vim 设定技巧
    autocmd FileType yaml setlocal ai ts=2 sw=2 et

设定

含义

setlocal

设定当前文件

ai

自动退格对齐 auto indent

ts

tab建长度为2空格 tabstop=2

sw

缩进长度为2 shiftwidth=2

et

把tab键变成空格 expandtab

二、基本示例

接上节的debug模块:
Ansible 的 registers用来捕捉一个task的输出作为一个变量。在Ansible的其它地方我们可以使用该变量,这种变量包含了这个任务的返回值
var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出

---
- hosts: test  %单独主机/ 组 /多个组 /all都可
  tasks:
    - name: install apache %任务1
      yum:
        name: httpd
        state: present

    - name: start apache  %任务2
      service:
        name: httpd
        state: started

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维


可以看到标准输出为hello

ansible playbook怎么带判断文件是否存在 ansible playbook实例_linux_02


verbosity: debug的级别(默认是0级,全部显示),,可以看到只显示了一部分

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_03


将debug的级别设定为0级,全部显示

ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_04


ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_05


msg:调试输出的消息

ansible playbook怎么带判断文件是否存在 ansible playbook实例_YAML_06


将该任务执行的输出作为变量(test)传递给debug模块,debug会直接将其打印输出

ansible playbook怎么带判断文件是否存在 ansible playbook实例_linux_07


想要输出指定的内容不能用下面格式

ansible playbook怎么带判断文件是否存在 ansible playbook实例_linux_08


应使用debug模块的msg参数

ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_09


或者如下格式,一个name只能包含一个task

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_10


设定一个tab=2个空格

ansible playbook怎么带判断文件是否存在 ansible playbook实例_linux_11


输出信息

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_12


ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_13


shell指令需要使用-v参数查看过程信息

ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_14


ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_15


ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_16


也可以使用以下写法

ansible playbook怎么带判断文件是否存在 ansible playbook实例_linux_17


在受控主机的/mnt目录下建立文件

ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_18


成功建立

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_19

三、palybook示例

1.playbook基础

主机与用户:

---
- hosts: server2      		  //指定主机组,可以是一个或多个组,逗号分隔。
  remote_user: root                //指定远程主机执行的用户名
  ---
- hosts: webservers
  remote_user: root            
  become: yes                		//切换用户运行
  become_user: mysql          	//指定sudo用户为mysql

Tasks 列表

Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。如果一个host执行task失败,整个tasks都会回滚。
每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

tasks:
    - name: install apache			//定义任务名

所有主机上完成第一个任务后再开始第二个任务。如果一个host执行task失败,整个tasks都会回滚。

使用ansible主机远程执行命令,在受控主机部署vsftpd,并且设置匿名用户可以登陆,重启动,加入到防火墙

安装vsftp:

---
- name: ftp install
  hosts: westos
  tasks:
    - name: dnf install        加-是因为区别每个动作
      dnf:                     安装部分
        name: vsftpd
        state: present

    - name: lineinfile
      lineinfile:                     修改文件部分
        path: /etc/vsftpd/vsftpd.conf
        regexp: "anonymous_enable=NO"
        line: "anonymous_enable=YES"
    
    - name: restart
      service:                         服务修改部分
        name: vsftpd
        state: restarted
        enabled: yes

    - name: firewalld
      firewalld:                        防火墙部分
        zone: public
        service: ftp
        permanent: yes
        state: enabled
        immediate: yes
...

ansible playbook怎么带判断文件是否存在 ansible playbook实例_自动化_20


执行playbook

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_21


测试,ftp成功安装

ansible playbook怎么带判断文件是否存在 ansible playbook实例_自动化_22

2.playbook执行命令

–check|-C :检测
–syntax-check :check language

ansible playbook怎么带判断文件是否存在 ansible playbook实例_linux_23


–list-hosts :列出hosts

ansible playbook怎么带判断文件是否存在 ansible playbook实例_YAML_24


–list-tasks :列出task

ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_25


ansible playbook怎么带判断文件是否存在 ansible playbook实例_YAML_26


执行playbook

ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_27


详细过程

ansible playbook怎么带判断文件是否存在 ansible playbook实例_YAML_28


–limit :指定执行主机

ansible playbook怎么带判断文件是否存在 ansible playbook实例_自动化_29

3.shell加密工具shc的安装

shell脚本是可读写的, 很有可能会泄露敏感信息, 如用户名/密码/路径/IP等. 同样在shell脚本运行时会也泄露敏感信息。shc是一个加密shell脚本的工具, 它的作用是把shell脚本转换为一个可执行的二进制文件. 这就很好的解决了上述问题。

真机网上下载shc包,并传给westosb

ansible playbook怎么带判断文件是否存在 ansible playbook实例_linux_30


ansible playbook怎么带判断文件是否存在 ansible playbook实例_可执行文件_31


node节点写一个脚本文件

ansible playbook怎么带判断文件是否存在 ansible playbook实例_自动化_32


node节点解压shc包,可以看到shc.c是一个指向shc-3.8.7.c(文本文件)的符号链接

ansible playbook怎么带判断文件是否存在 ansible playbook实例_YAML_33


安装gcc

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_34


1、gcc编译,选项-o用于指定要生成的结果文件,后面跟的就是结果文件名字。

o是output的意思,不是目标的意思。结果文件可能是预处理文件、汇编文件、目标文件或者最终可执行文件。

2、执行可执行文件shc

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_35


将可执行文件移到/bin目录(用于存放二进制文件)

ansible playbook怎么带判断文件是否存在 ansible playbook实例_自动化_36


-f 指定要解密的文件,-r 指定一种安全的加密方式(使用 RC4 加密算法,它能够把 shell 程序转换成二进制可执行文件 );

生成两个文件test.sh.x和test.sh.x.c,前者是动态链接的二进制可执行文件,后者相应的是C程序(脚本的源文件,可删除)。

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_37


可以看到二进制可执行文件被加密了,cat无法看到

ansible playbook怎么带判断文件是否存在 ansible playbook实例_运维_38


执行可以显示解密后的输出

ansible playbook怎么带判断文件是否存在 ansible playbook实例_YAML_39