ansible模块管理

ansible

简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

架构及原理

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

  • 连接插件connection plugins:负责和被监控端实现通信;
  • host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
  • 各种模块核心模块、command模块、自定义模块;
  • 借助于插件完成记录日志邮件等功能;
  • playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

项目

ansible环境安装部署

管理端:20.0.0.10
被管理端:20.0.0.11
被管理端:20.0.0.12

[root@master01 ~]# yum -y install epel-release
[root@master01 ~]# yum -y install ansible
[root@master01 ~]# ansible --version   //查看ansible版本
[root@master01 ~]# yum -y install tree  //安装树状结构展示文件夹
[root@master01 ~]# tree /etc/ansible/   //树状结构展开ansible文件夹
/etc/ansible/
├── ansible.cfg
├── hosts
└── roles

1 directory, 2 files

[root@master01 ~]# cd /etc/ansible/
[root@master01 ansible]# vi hosts  //配置主机清单
//在24行后添加
[webserver]
20.0.0.11
[mysql]
20.0.0.12
[root@master01 ~]# ssh-keygen -t rsa   //配置免密登录
[root@master01 ~]# ssh-copy-id root@20.0.0.11
[root@master01 ~]# ssh-copy-id root@20.0.0.12  //配置密钥对验证
[root@master01 ~]# ssh-agent bash
[root@master01~]# ssh-add
Enter passphrase for /root/.ssh/id_rsa: 
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)    //配置面交互代理

ansible命令行模块

command模块(默认执行模块)

命令格式: ansible [主机] [-m模块] [-a args]

[root@master01 .ssh]#ansible-doc -I       //列出所有已安装的模块注:按q退出
[root@master01 .ssh]#ansible-doc -s yum         //-s列出yum模块描述信息和操作动作
[root@master01 .ssh]# ansible-doc -s command   //查看command模块信息

在这里插入图片描述

[root@master01 .ssh]# ansible mysql -m command -a 'date'   //指定分类执行date
[root@master01 .ssh]# ansible 20.0.0.12 -m command -a 'date'  //指定ip执行date
[root@master01 .ssh]# ansible all -m command -a 'date' //所有hosts主机执行date

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

[root@master01 .ssh]# ansible all -m command -a 'ls /' 

在这里插入图片描述
在这里插入图片描述

[root@master01 .ssh]# ansible all -a 'ls /'    //不加-m模块 则默认运行command模块

在这里插入图片描述
在这里插入图片描述

cron 模块

两种模块 (state):present表示添加(可以省略),absent表示移除。

[root@master01 .ssh]# ansible-doc -s cron
//查看cron模块信息

在这里插入图片描述
建立任务计划

[root@master01 .ssh]# ansible mysql -m cron -a 'minute="*/1" job="/usr/bin/echo hello >> /opt/hello.txt" name="cron_hello"'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "cron_hello"
    ]
}
[root@master01 .ssh]# ansible mysql -a 'crontab -l'
20.0.0.12 | CHANGED | rc=0 >>
#Ansible: cron_hello
*/1 * * * * /usr/bin/echo hello >> /opt/hello.txt

在这里插入图片描述
在节点20.0.0.12上查看

[root@node02 opt]# cat hello.txt 
hello
hello

在这里插入图片描述

[root@master01 .ssh]# ansible mysql -a 'crontab -l'
20.0.0.12 | CHANGED | rc=0 >>
#Ansible: cron_hello
*/1 * * * * /usr/bin/echo hello >> /opt/hello.txt
[root@master01 .ssh]# ansible mysql -m cron -a 'name="cron_hello" state=absent'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}
[root@master01 .ssh]# ansible mysql -a 'crontab -l'
20.0.0.12 | CHANGED | rc=0 >>

在这里插入图片描述

user模块

user模块是请求的是useradd,userdel,usermod三个指令

[root@master01 .ssh]# ansible all -m user -a 'name="xlx"'
20.0.0.12 | SUCCESS => { 在所有节点创建用户xlx
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "append": false, 
    "changed": false, 
    "comment": "xlx", 
    "group": 1000, 
    "home": "/home/xlx", 
    "move_home": false, 
    "name": "xlx", 
    "shell": "/bin/bash", 
    "state": "present", 
    "uid": 1000
}
20.0.0.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "append": false, 
    "changed": false, 
    "comment": "xlx", 
    "group": 1000, 
    "home": "/home/xlx", 
    "move_home": false, 
    "name": "xlx", 
    "shell": "/bin/bash", 
    "state": "present", 
    "uid": 1000
}

在20.0.0.11 20.0.0.12上查看用户

[root@node01 ~]# id xlx
uid=1000(xlx) gid=1000(xlx)=1000(xlx)
[root@node02 ~]# id xlx
uid=1000(xlx) gid=1000(xlx)=1000(xlx)
[root@master01 .ssh]# ansible webserver -m user -a 'name="xlx" state=absent'  //删除webserver(20.0.0.11)创建的用户
20.0.0.11 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "force": false, 
    "name": "xlx", 
    "remove": false, 
    "state": "absent"
}

在这里插入图片描述
在webserver上查看

[root@node01 ~]# id xlx
id: xlx: no such user

group模块

group模块请求的是groupadd, groupdel, groupmod三个指令

[root@master01 .ssh]# ansible mysql -m group -a 'name=caiwu gid=1050 system=yes'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 1050, 
    "name": "caiwu", 
    "state": "present", 
    "system": true
}
root@node02 opt]# getent group | grep caiwu
caiwu:x:1050:
[root@node02 opt]# getent networks
default               0.0.0.0
loopback              127.0.0.0
link-local            169.254.0.0
[root@master01 .ssh]# ansible mysql -m user -a 'name=xlx uid=1050 system=yes group=caiwu'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "append": false, 
    "changed": true, 
    "comment": "xlx", 
    "group": 1050, 
    "home": "/home/xlx", 
    "move_home": false, 
    "name": "xlx", 
    "shell": "/bin/bash", 
    "state": "present", 
    "uid": 1050
}

在20.0.0.12上查看

[root@node02 opt]# id xlx
uid=1050(xlx) gid=1050(caiwu)=1050(caiwu)

copy模块

[root@master01 .ssh]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=xlx mode=600'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "ff4faf6ae56cd82597fdbde465a2923d67ea7217", 
    "dest": "/opt/fstab.bak", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "76b148d343f4caad3312ac67866e4e99", 
    "mode": "0600", 
    "owner": "xlx", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 617, 
    "src": "/root/.ansible/tmp/ansible-tmp-1610420444.83-62016-263027696114064/source", 
    "state": "file", 
    "uid": 1050
}

在这里插入图片描述

[root@master01 .ssh]# ansible mysql -m copy -a 'content="this is ky07" dest=/opt/ky07.txt'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "d73dc4a3a528a22cdac0965e7cfa484261340d02", 
    "dest": "/opt/ky07.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "1974a7958156c221901a7adc9ebcde56", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1610420634.61-62083-274303134967989/source", 
    "state": "file", 
    "uid": 0
}

在这里插入图片描述
在node2上查看

[root@node02 opt]# ll
总用量 8
-rw-------. 1 xlx  root 617 112 11:00 fstab.bak
-rw-r--r--. 1 root root  90 112 10:33 hello.txt
drwxr-xr-x. 2 root root   6 326 2015 rh
[root@node02 opt]# cat fstab.bak 

#
# /etc/fstab
# Created by anaconda on Sun Dec 20 14:31:59 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=328048c5-5fa8-43b5-8a28-c580eaaa7776 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/cdrom              /mnt                    ios9660 defaults        0 0
[root@node02 opt]# cat ky07.txt 
this is ky07[root@node02 opt]# ls
fstab.bak  hello.txt  ky07.txt  rh

file模块

[root@master01 .ssh]# ansible mysql -m file -a 'owner=root group=caiwu mode=666 path=/opt/fstab.bak'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 1050, 
    "group": "caiwu", 
    "mode": "0666", 
    "owner": "root", 
    "path": "/opt/fstab.bak", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 617, 
    "state": "file", 
    "uid": 0
}

在这里插入图片描述
在这里插入图片描述

[root@master01 .ssh]# ansible mysql -m file -a 'path=/fstab.link src=/opt/fstab.bak state=link'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/fstab.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:root_t:s0", 
    "size": 14, 
    "src": "/opt/fstab.bak", 
    "state": "link", 
    "uid": 0
}

在这里插入图片描述

在这里插入图片描述

[root@master01 .ssh]# ansible mysql -m file -a 'path=/opt/abc state=touch' 
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/opt/abc", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

在这里插入图片描述

在这里插入图片描述

[root@master01 .ssh]# ansible mysql -m file -a 'path=/opt/share state=directory mode=755'
20.0.0.12 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/opt/share", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

在这里插入图片描述
在这里插入图片描述

ping模块

[root@master01 .ssh]# ansible all -m ping 
20.0.0.12 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
20.0.0.11 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

在这里插入图片描述

service模块

[root@master01 ~]# ansible webserver -m service -a 'name=httpd enabled=true state=started'   //启动httpd服务

在这里插入图片描述

[root@node01 ~]# systemctl status httpd.service

在这里插入图片描述

shell模块

[root@master01 ~]# ansible webserver -m user -a 'name=xlx'
[root@master01 ~]# ansible webserver -m shell -a 'echo 123123 | passwd --stdin xlx'

在这里插入图片描述

script模块

[root@master01 ~]# cd /opt
[root@master01 opt]# vim test.sh
#!/bin/bash
echo "this is test script" > /opt/script.txt    //指定一段信息,生成一个新文件
chmod 666 /opt/script.txt  //给文件赋予权限

[root@master01 opt]# ls
rh  test.sh
[root@master01 opt]# chmod +x test.sh
[root@master01 opt]# ls
rh  test.sh
[root@master01 opt]# ansible all -m script -a 'test.sh'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

yum模块

[root@master01 ~]# ansible mysql -m yum -a 'name=httpd state=absent'     //yum安装httpd服务

在这里插入图片描述

[root@node02 ~]# rpm -q httpd

在这里插入图片描述

[root@master01 ~]# ansible mysql -m yum -a 'name=httpd state=absent'   //yum卸载httpd服务

在这里插入图片描述

[root@node02 ~]# rpm -q httpd

在这里插入图片描述

setup模块

[root@master01 opt]# ansible mysql -m setup  //获取mysql组主机的facts信息

在这里插入图片描述

ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可以通过Dynamic Inventory动态生成

1. url http://www.baidu.com:80/new
url:资源定位
协议://主机名.二级域名.顶级域名.(根域):端口/虚拟目录

一般主机名使用FQDN(完全合格域名):www.baidu.com   (主机名+域名)

域名:baidu.com

进入主机清单

[root@master ~]# vi /etc/ansible/hosts 

[webserver]  方括号设置组名
20.0.0.11
[mysql]
20.0.0.12

www1.example.org  定义被监控主机,这边可以是主机名也可以是IP地址,主机名需要修改/etc/hosts文件
www2.example.org:2222   冒号后定义远程连接端口,默认是ssh的22端口
如果是名称类似的主机,可以使用列表的方式标识各个主机
 www[001:006].example.com

转换为6个节点,数据冗余


www001.example.com
www002.example.com
www003.example.com
www004.example.com
www005.example.com
www006.example.com

在这里插入图片描述
如果是名称类似的主机,可以使用列表的方式标识各个主机

[webserver]
www[01 :50].example.org ansible ssh user-root ansible_ssh_pass=123456
                                                                   ssh用户身份登录
[dbbservers]
db-[a:fJ.example.org //支持匹配abc 

Inventory中变量

主机变量

针对节点赋予对应的变量值

[webserver]
www1.magedu.com http_ port=80 maxRequestsChild=808
www2.magedu.com http_ port= 8080 maxRequestsChild=909

组变量

[servers:vars]
ntp_ server=ntp.example.org
nfs_ server=nfs.example.org

组嵌套

[apache]  组
http1.example.org   包含两个节点
http2.example.org  
[nginx]    组
ngx1.example.org   包含两个节点
ngx2.example.org  
[webserverschildren]
apache
nginx

inventory变量参数

      参数                                            说明
ansible_ ssh host                   将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible ssh port                    ssh端口号如果不是默认的端口号,通过此变量设置.
ansible ssh_user                    默认的ssh用户名
ansible_ssh_pass                   ssh密码(这种方式并不安全,我们强烈建议使用--ask-pass或SSH密钥)
ansible_ssh_private_key_file       ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况.
ansible ssh_common args             此设置附加到sftp,scp和ssh的缺省命令行(先开启功能)
ansible_sftp_extra_args             此设置附加到默认sftp命令行。(扩展命令行)
ansible_scp_extra_args              此设置附加到默认scp命令行。
ansible ssh extra args              此设置附加到默认ssh命令行。
ansible ssh pipelining              确定是否使用SSH管道。这可以覆盖ansible.cfg中得设置。

VPN:借助公有网络开启隧道加密,传输数据也加密;
  翻墙:隧道建立连接关系,会在完整数据包外套一个ip地址包头
国内对DNS进行过滤

ansible shell type                    目标系统的shell类型.默认情况下,命令的执行使用'sh' 语法,可设置为'csh''fish'.
ansible python interpreter            目标主机的python路径.适用于的情况:系统中有多个Python,或者命令路径不是/usr/bin/python"比如*
ansible * interpreter                 这里的"*"可以是ruby或perl或其他语言的解释器,作用和ansible python interpreter 类似
ansible shell executable              这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh。

总结

1.ansible是基于模块工作的,不同的模块对应不同服务操作配置,ansible可以由此实现批量系统配置、批量程序部署、批量运行命令等功能。

2. 模块类别: 
user用户---group组,
copy复制(原文件src,目标位置dest)----file管理文件,创,增,删(文件位置path,原文件src)。

3.shell脚本中可以写多个语句,而且shell可以识别重定向,追加,默认command命令不识别

4.项目示例
当根分区容量不足,接近临界值时,如何处理?

解决思路:
a.首先根分区不能创建LVM,所以无法扩展
b.根分区会积累大量的日志文件,文件在/var/log/...下,可以通过删除老日志,备份新日志,来释放空间
c.如果还是不行,可以将根分区中大的文件拷贝到其它分区,且分区是LVM创建的,在```原根分区上创建软链接来解决容量问题

5.当ansible使用ping模块,检查节点连通性时,如果不是success状态,表明连通有问题
解决方案:

   a.检查网络的连通性,是否ping有效
   b.查看master管理端上的vi /etc/ansible/hosts里标签名称是否正确
   c.查看节点上.ssh中的密钥有问题,删除密钥文件,进行重传
   rm -rf authorized_keys 
   d,查看管理端的ssh端口是否开启服务
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页