基础知识补充:

常用自动化运维工具

Ansible:使用python来开发的,无需设置Agentless(代理),一般管理几百台。与ssh的方式也不一样,ssh是基于c/s模式(客户端+服务器)来使用服务端提供的服务,属于多台客户端访问一台服务器。而ansible是控制端,使用装了ansible的主机管理多台主机。也叫做主控端。Ansible是通过ssh端口来实现无代理配置。

Saltstack:使用python语言开发,一般需部署agent(代理),执行效率更高,一般管理几千台。

Puppet:使用ruby语言开发,功能强大,配置复杂,适合大型环境(了解即可)

下面这些使用者较少,不做介绍

Fabric:使用python语言开发,agentless(不需要设置代理)

Chef: 使用ruby语言开发

Cfengine

Func

Ansible特性

模块化:调用特定的模块,完成特定任务

有Paramiko(基于ssh的开发语言),PyYAML(YAML语言),Jinja2(模板语言)这三个关键模块,并支持自定义模块

基于Python语言实现

部署简单,基于python和SSH(默认已安装),agentless(不需要设置代理)

安全,基于OpenSSH

支持playbook编排任务

幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况

无需代理不依赖PKI(无需ssl)

可使用任何编程语言写模块

YAML格式,编排任务,支持丰富的数据结构

较强大的多层解决方案

用户通过ANSIBLE来下达指令,通常是逐条命令执行。可以通过公有/私有云来实现远程管理.


主机库存中包含着所有主机的列表,通过主机分组及连接插件来实现管理不同的主机,给一些主机升级,一些主机创建用户等目的。


剧本是用在批量,定期做例行性工作的时候,比如定期做备份等等。在复杂一些的情况会使用角色(Roles),相当于多个剧本的组合。


Ansible主要组成部


ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件


INVENTORY:Ansible管理主机的清单,位于/etc/anaible/hosts文本文件中,内容为要管理的主机的名称或IP地址.


MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义


PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插


件等,该功能不常用


API:供第三方程序调用的应用程序编程接口


ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具


Ansible命令执行来源:


1 USER,普通用户,SYSTEM ADMINISTRATOR(系统管理员)


2 CMDB(配置管理数据库) API 调用(需要开发接口)


3 PUBLIC/PRIVATE CLOUD API调用(需要开发接口)


USER-> Ansible Playbook -> Ansibile(运维工程师通常用这种方式)


利用ansible实现管理的方式:


1 Ad-Hoc 即单条ansible命令,主要用于临时命令使用场景


Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划


Ansible-playbook(剧本)执行过程:


将已有编排好的任务集写入Ansible-Playbook,通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行


Ansible主要操作对象:


HOSTS主机


NETWORKING网络设备


注意事项


执行ansible的主机一般称为主控端,中控,master或堡垒机


主控端Python版本需要2.6或以上


被控端Python版本小于2.4需要安装python-simplejson


被控端如开启SELinux需要安装libselinux-python


windows不能做为主控端


ansible安装:配置好仓库的epel源,直接yum install ansible即可。


确认版本号: ansible –version

 ansible的配置文件


/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,大部分配置不用修改,默认值即可.


/etc/ansible/hosts 主机清单,要控制的主机必须存放在这个文件中。


/etc/ansible/roles/ 存放角色的目录,角色可理解为多个剧本的集合


 ansible的程序


/usr/bin/ansible 主程序,临时命令执行工具


/usr/bin/ansible-doc 查看配置文档,模块功能查看工具(很多模块的帮助信息都在这里,相当于man)


/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台


/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具(pull,拉取的意思。有时候把别人的文件拉取到我这来,有时候把我的东西推送到别人那)


/usr/bin/ansible-vault 文件加密工具


/usr/bin/ansible-console 基于Console界面与用户交互的执行工具


ansible模块介绍:

执行哪些模块,就使用-m参数来指定。对其执行哪些动作则使用-a参数指定。

下面的演示都是一个中控机,然后2个node。

1)group模块

group模块:管理用户组模块

    相关选项:

      name:组名称

      gid:指定GID

      state:present/absent
        present:表示创建。absent:表示删除       system:yes/no
        yes/no:是否为系统用户。

  1.1)案例演示:

[root@ELK-chaofeng01 ~]#ansible all -m group -a "gid=3000 name=chaofeng state=present system=no"
172.16.0.53 | CHANGED => {
"changed": true,
"gid": 3000,
"name": "chaofeng",
"state": "present",
"system": false
}
172.16.0.52 | CHANGED => {
"changed": true,
"gid": 3000,
"name": "chaofeng",
"state": "present",
"system": false
}

2)user模块

由于user模块的选项众多,这里只介绍一些常用的选项:

      name:用户名

      password:为用户设置登陆密码,此密码是明文密码加密后的密码

      update_password:always/on_create

        always:只有当密码不相同时才会更新密码(默认)

        on_create:只为新用户设置密码

      shell:用户的shell设定

      groups:用户附加组设定

      home:指定用户的家目录
      append:yes/no         yes:增量添加group         no:全量变更group,只设置groups指定的group组(默认)       remove:配合state=absent使用,删除用户的家目录->remove=yes

案例演示:

  2.1)添加一个用户

[root@ELK-chaofeng01 ~]#ansible all -m user -a "uid=5000 name=testuser state=present groups=root shell=/bin/tcsh"
172.16.0.52 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 5000,
"groups": "root",
"home": "/home/testuser",
"name": "testuser",
"shell": "/bin/tcsh",
"state": "present",
"system": false,
"uid": 5000
}
172.16.0.53 | CHANGED => {
"changed": true,
"comment": "",
"create_home": true,
"group": 5000,
"groups": "root",
"home": "/home/testuser",
"name": "testuser",
"shell": "/bin/tcsh",
"state": "present",
"system": false,
"uid": 5000
}

注意:要添加的附加组也是需要在node节点的主机上事先存在的,否则会报错:比如  

    

3)copy模块

copy模块:复制本地文件至远程主机上    

    相关选项:

      backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no

      content:用于替代“src”,可以直接设定指定文件的值

      dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录

      directory_mode:递归设定目录的权限,默认为系统默认权限

      force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes

      others:所有的file模块里的选项都可以在这里使用

      src:被复制到远程主机的本地文件(也就是中控机上的文件),可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

      owner,group,mode...
      mode:设定复制的文件的权限属性,数字表示法来设定。

案例:

  3.1)将中控机上/etc/fstab文件复制到远程节点上:

[root@ELK-chaofeng01 ~]#ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
172.16.0.52 | CHANGED => {
"changed": true,
"checksum": "150ff5f6b99363314d375b73a5708e2a9911e52a",
"dest": "/tmp/fstab.ansible",
"gid": 0,
"group": "root",
"md5sum": "5fe64bfebc65805a98e7e9d47e9f379f",
"mode": "0600",
"owner": "root",
"size": 501,
"src": "/root/.ansible/tmp/ansible-tmp-1553574326.56-222928675924643/source",
"state": "file",
"uid": 0
}
172.16.0.53 | CHANGED => {
"changed": true,
"checksum": "150ff5f6b99363314d375b73a5708e2a9911e52a",
"dest": "/tmp/fstab.ansible",
"gid": 0,
"group": "root",
"md5sum": "5fe64bfebc65805a98e7e9d47e9f379f",
"mode": "0600",
"owner": "root",
"size": 501,
"src": "/root/.ansible/tmp/ansible-tmp-1553574326.57-180187752562484/source",
"state": "file",
"uid": 0
}

我们可以在node节点上看看权限信息

[root@ELK-chaofeng02 ~]#ls /tmp/fstab.ansible  -l
-rw------- 1 root root 501 Mar 26 12:25 /tmp/fstab.ansible

  3.2)复制一个目录

[root@ELK-chaofeng01 ~]#ansible 172.16.0.52 -m copy -a "src=/etc/yum.repos.d/ dest=/tmp/yum.repos_ansible owner=root"
172.16.0.52 | CHANGED => {
"changed": true,
"dest": "/tmp/yum.repos_ansible/",
"src": "/etc/yum.repos.d/"
}

    注意:上面的src路径中,是我们定义的要复制的源目录,源目录后必须带上根路径”/“标识符。否则不带的话,复制的是目录本身,并非目录下的所有文件。

  在node节点上查看一下:

    

补充:fetch的作用:将远程主机上的文件复制到本地来。用法格式:ansible-doc -s fetch

4)shell模块:让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等。

如果说我们的目标主机需要执行一些命令类操作,因此我们就需要使用shell模块

[root@ELK-chaofeng01 ~]#ansible all -m shell -a "ip addr"
172.16.0.53 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:e5:63:80 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.53/16 brd 172.16.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::1924:db50:da5d:2e13/64 scope link
valid_lft forever preferred_lft forever 172.16.0.52 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:5b:be:3f brd ff:ff:ff:ff:ff:ff
inet 172.16.0.52/16 brd 172.16.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f427:6471:2b8a:40f8/64 scope link
valid_lft forever preferred_lft forever

5)file模块:多设置文件属性

相关选项:

      force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

      group:定义文件/目录的属组

      mode:定义文件/目录的权限

      owner:定义文件/目录的属主

      path:必选项,定义文件/目录的路径

      recurse:递归设置文件的属性,只对目录有效

      src:被链接的源文件路径,只应用于state=link的情况

      dest:被链接到的路径,只应用于state=link的情况

      state:

             directory:如果目录不存在,就创建目录

             file:即使文件不存在,也不会被创建此文件

             link:创建软链接

             hard:创建硬链接

             touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

             absent:删除目录、文件或者取消链接文件

案例:

  5.1)创建一个目录

    

  5.2)创建一个符号链接

    

6)cron模块

minute=/hour=/day=/month=/weekday= 某个值不写,默认就是*

      name:必选项,任务描述信息

      job:执行的任务,要加引号

      state:present(创建)/absent(删除)

案例:

  6.1)定时在目标主机上执行任务

[root@ELK-chaofeng01 ~]#ansible all -m cron -a "minute=*/3 job='/usr/sbin/echo haha &>/dev/null' name=None state=present"
172.16.0.52 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
172.16.0.53 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"None"
]
}

  然后我们去目标主机看一下:

  

  在cron计划任务里面确实有这个任务。

  取消计划任务:

[root@ELK-chaofeng01 ~]#ansible all -m cron -a "minute=*/3 job='/usr/sbin/echo haha &>/dev/null' name=None state=absent"

7)yum模块:管理安装rpm程序包

相关选项:
      name:程序包名称,可带版本号       state:present、installed、latest(安装)/absent、removed(删除)

案例:

  1、安装一个包apr-devel

  

8)service模块:管理服务

      name:服务名称

      state:started/stopped/restarted/reloaded

      enabled:true/false  是否要开机自启。

      runlevel:运行级别

案例:

  8.1)将所有节点启动nginx服务。

  

  8.2)将所有节点的nginx服务关闭了

  

9)自定义script脚本:自动上传到所有的节点并执行此脚本。

  命令语法:

案例演示:

  9.1)上传一个脚本到节点并执行

    先在中控机编写一个脚本:

    

    然后在中控机上传到各个节点并执行

[root@ELK-chaofeng01 ~]#ansible all -m script -a "/tmp/echo.sh"
172.16.0.52 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.16.0.52 closed.\r\n",
"stderr_lines": [
"Shared connection to 172.16.0.52 closed."
],
"stdout": "",
"stdout_lines": []
}
172.16.0.53 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.16.0.53 closed.\r\n",
"stderr_lines": [
"Shared connection to 172.16.0.53 closed."
],
"stdout": "",
"stdout_lines": []
}

    然后到其中一个节点查看一下:

    

    执行成功了。

ansible学习基础知识和模块(一)的更多相关文章

  1. Matrix学习——基础知识

    以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GDI+的时候再次学习如何使用矩阵来变化图像,看了之后在这里总结说明. 首先大家看看下面这个3 x 3的矩阵,这个矩阵被分割成4部 ...

  2. JAVA学习基础知识总结(原创)

    (未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...

  3. Python学习-基础知识-2

    目录 Python基础知识2 一.二进制 二.文字编码-基础 为什么要有文字编码? 有哪些编码格式? 如何解决不同国家不兼容的编码格式? unicode编码格式的缺点 如何既能全球通用还可以规避uni ...

  4. python基础知识9——模块2——常见内置模块

    内置模块 内置模块是Python自带的功能,在使用内置模块相应的功能时,需要[先导入]再[使用] 1.sys 用于提供对Python解释器相关的操作: sys.argv 命令行参数List,第一个元素 ...

  5. MySQL学习基础知识1

    什么是数据库? 数据库就是存储数据的仓库. 存储方式: 变量 无法永久存储 文件处理,可以永久存储,弊端:文件只能在自己的计算机读写,无法被分享(局域网除外) 数据库分类: 1.关系型数据库 提供某种 ...

  6. IOS科研IOS开发笔记学习基础知识

    这篇文章是我的IOS学习笔记,他们是知识的基础,在这里,根据记录的查询后的条款. 1,UIScrollView能完毕滚动的功能. 示比例如以下: UIScrollView *tableScrollVi ...

  7. python基础知识8——模块1——自定义模块和第三方开源模块

    模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...

  8. MySQL学习基础知识2

    1.基础语句 查 select(* | 字段名 | 四则运算 | 聚合函数) from 表名称; 加上as取别名 as可省略 如:select name, (math+english)/2 total ...

  9. ansible学习系列2-ansible常用模块使用

    1. 查看支持的模块 [root@localhost ~]# ansible-doc -l 这里我们看下ansible的支持的模块个数 [root@localhost ~]# ansible-doc ...

随机推荐

  1. springcloud之服务注册与发现

    本次分享的是关于springcloud服务注册与发现的内容,将通过分别搭建服务中心,服务注册,服务发现来说明:现在北京这边很多创业公司都开始往springcloud靠了,可能是由于文档和组件比较丰富的 ...

  2. MySQL如何系统学习

    MySQL是当下互联网最流行的开源数据库.不管你使用或者学习何种编程语言,都将会使用到数据库,而MySQL则是应用最为广泛的数据库,没有之一! 之前在我的博客上也发布过一些MySQL优化配置项,都收到 ...

  3. Spring mvc参数类型转换

    1,需求 有时候我们接收到的参数为String类型的,但是我们需要将它们转化为其他类型的如:date类型,枚举类型等等,spring mvc为我们提供了这样的功能. 2,配置文件 在springmvc ...

  4. 代理自动配置文件PAC的使用方法

    我通常上网使用两个浏览器,safari用于一般上网:Chrome安装SwitchyOmega插件,在不同的代理中切换,来保证某些网站的上网速度. 但是这种方式到了手机上就有点懵,几乎所有的iPhone ...

  5. 通过Python、BeautifulSoup爬取Gitee热门开源项目

    一.安装 1.通过requests 对响应内容进行处理,requests.get()方法会返回一个Response对象 pip install requests 2.beautifulSoup对网页解 ...

  6. MySQL 隔离级别

    一.事务特性 1.原子性 事务是一个原子操作单元,事务中包含的所有操作要么都做,要么都不做,没有第三种情况. 2.一致性 事务操作前和操作后都必须满足业务规则约束,比如说A向B转账,转账前和转账后AB ...

  7. 如何解决svn清理失败 不能更新 cleanup失败 cleanup乱码 更新乱码 svn更新提示清理 清理乱码不能清理 svn故障修复SVN cleanup 陷入死循环 svn cleanup时遇到错误怎么办

    平时使用svn的过程中,有的时候由于自己操作故障或者系统原因,导致svn不能更新,提示cleanup也不能成功,陷入了死循环 原因是;svn的数据库队列原因 1,下载sqlite3.exe,googl ...

  8. BUG心得

    在<程序员,你会从 Bug 中学习么?>一文中,我写了我是怎样追踪这些年遇到的最有趣 bug 的.最近我重新浏览了这所有的 194 个条目(历时 13 年),看看我从这些 bug 中学到了 ...

  9. Redux进阶(像VUEX一样使用Redux)

    更好的阅度体验 前言 redux的问题 方案目标 如何实现 思考 前言 Redux是一个非常实用的状态管理库,对于大多数使用React库的开发者来说,Redux都是会接触到的.在使用Redux享受其带 ...

  10. 跨站脚本攻击xss学习

    0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: ...