ansible学习基础知识和模块(一)

  基础知识补充:node

经常使用自动化运维工具 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来下达指令,一般是逐条命令执行。能够经过公有/私有云来实现远程管理.python

 
 

主机库存中包含着全部主机的列表,经过主机分组及链接插件来实现管理不一样的主机,给一些主机升级,一些主机建立用户等目的。linux

 
 

剧本是用在批量,按期作例行性工做的时候,好比按期作备份等等。在复杂一些的状况会使用角色(Roles),至关于多个剧本的组合。nginx

 
 

Ansible主要组成部shell

 
 

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

 
 

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

 
 

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

 
 

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

 
 

件等,该功能不经常使用安全

 
 

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(删除)

案例:

  一、安装一个包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": [] }

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

    

    执行成功了。

相关文章
相关标签/搜索