ansible是基于Python语言实现的,模块化:调用特定的模块完成特定的任务,支持自定义模块,可使用任何编程语言写模块(账号,软件等)。部署简单,基于python和SSH,相对安全,基于OpenSSH。
功能:批量执行远程命令,可以对远程的多台主机同时进行命令的执行;批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务;编排高级的企业级复杂的IT架构任务,Ansible的Playbook和role可以轻松实现大型的IT复杂架构;提供自动化运维工具的开发API,有很多运维工具,如jumpserver就是基于ansible实现自动化管理功能。
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对。
ansible的安装:
yum安装需要加入epel源:本地yum源:
[root@Node1 ~]#:vim /etc/yum.repos.d/CentOS-Base.repo
[epel]
name=gn
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
https://mirrors.cloud.tencent.com/epel/$releasever/x86_64
https://mirrors.huaweicloud.com/epel/$releasever/x86_64
https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/x86_64
gpgcheck=0也可以直接yum安装:[root@Node1 ~]#:yum install -y epel-release.noarch
选择一种即可
安装ansible:yum install -y ansible
查看版本:使用ansible --version
相关文件:
/etc/ansible/ansible.cfg主配置文件,配置ansible工作特性,也可以在项目的项目中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件。
/etc/ansible/hosts主机清单
/etc/ansible/roles/存放角色的目录
主配置文件中几乎不需要修改,要开启71行的ansible的不验证即可
host_key_checking = False
由于是基于SSH,需要在客户端做一个ssh免密登录:
[root@Node1 ansible]#:ssh-keygen
三个回车
[root@Node1 ansible]#:ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.114.20
输入yes
输入密码
[root@Node1 ansible]#:ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.114.30
在主机清单中添加web,主机:vim /etc/ansible/hosts
[web]
192.168.114.20
192.168.114.30
查看主机:
ansible也是一个命令,执行临时任务,一次性任务 ,测试:
ansible 192.168.114.20 -m ping
-m是模块,使用ping模块
加个-k,密码验证:
我们添加了web模块,也可以直接使用web名,来测试:
ansible web -m ping
SUCCESS
其中ansible中支持许多模块:
通过命令ansible-doc -l查看
可以发现有3387个模块。
[root@Node1 ansible]#:ansible-doc -l | wc -l
3387如果要具体查找某一个模块,可以,如查找ping模块:ansible-doc ping
#如果看ping模块详细解释:ansible-doc ping
简单模块:
模块:
但最常用的模块也就二三十个,针对特定业务只用十几个模块
1.command模块
2.shell模块
3.script模块
4.copy模块
5.get_url模块
6.fetch模块
7.stat模块
8.unarchive模块
9.archive模块
10.hostname模块
11.cron模块
12.yum和apt模块
13.yum_repository模块
14.service模块
1.command模块:
功能:在远程主机执行命令,此为默认模块,可忽略-m选项
该模块不具有幂等性
[root@Node1 ansible]#:ansible web -m command -a "touch /opt/asb"
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.114.30 | CHANGED | rc=0 >>192.168.114.20 | CHANGED | rc=0 >>
在两台主机上发现创建了abs文件
2.shell模块:
要将配置文件中的114行改成shell:vim /etc/ansible/ansible.cfg。复制粘贴,yy,p
ansible web -a "echo '123' > /opt/test"
验证:发现在192.168.114.20和30上都有了文件test,内容是123
3.script模块:
如果想在多台主机上做某些事情,通过脚本的方式,在本机能够对多台主机执行脚本操作。
在本机/data下写一个创建文件的脚本:
执行命令:ansible web -m script -a "/data/test.sh"
此时,能够在两台主机上看到/opt/下有一个ky36的文件:
[root@Node2 opt]#:ls
ky36[root@Node3 opt]#:ls
ky36
4.copy模块:
复制模块
src代表源文件路径
dest代表文件落地路径
owner属主
group属组
mode代表权限
我们把主机的/etc/fstab复制对面的/opt/下,并添加权限为644
ansible web -m copy -a "src=/etc/fstab dest=/opt/ mode=644"
查看验证:
在两台主机上创建张三用户:
[root@Node2 opt]#:useradd zhangsan -M -s /sbin/nologin
[root@Node2 opt]#:useradd zhangsan -M -s /sbin/nologin
复制/etc/passwd过去,指定属主和属组:ansible web -m copy -a "src=/etc/passwd dest=/opt/ mode=644 group=zhangsan owner=zhangsan"
验证:过来了,属主和属组都是zhangsan
ansible web -m copy -a "content='nihao cxk' dest=/opt/wsc",写文本复制到对面的/opt/下文件名叫wsc
验证:
5.get_url模块:
功能: 用于将文件从http、https或ftp下载到被管理机节点上
url下载文件的URL,下载的路径
dest下载到目标路径(绝对路径),指明下载文件的存放目录
告诉别人路径在什么位置
owner:指定属主
group:指定属组
mode:指定权限
checksum:对目标文件在下载后计算摘要,以确保其完整性
验证:
6.fetch模块:
从远程主机提取文件至ansible的主控端,与copy相反,但不支持目录
ansible web -m fetch -a "src=/etc/passwd dest=/mnt"这里的src是远端的/etc/passwd,提取到本机的/mnt下:
由于是两个远端主机,在/mnt/下都列出来了两个主机。包括/etc/passwd
一般适用于提取远端的日志文件:ansible web -m fetch -a "src=/var/log/messages dest=/data/"
7.file模块:
path 指定文件路径
state 文件状态,有:新建(touch) 删除(absent) 文件夹(directory) 链接文件(link)等
src 源文件
mode 权限
owner 属主
group 属组
recurse 递归,修改属性时有效
例1:在/opt/下创建wsc文件,权限644,属主zhangsan,属组root
ansible web -m file -a "path=/opt/wsc state=touch mode=644 owner=zhangsan group=root"
查看:
ansible web -m file -a "path=/opt/wsc state=absent" 删除/opt/下的wsc
查看:
例2:将/etc/passwd软链接到远端主机/opt/下取名为soft
验证查看:
8.stat模块:
功能:检查文件或文件系统的状态
exists:判断是否存在
检查passwd文件的状态信息
ansible web -m stat -a "path=/etc/passwd"
stat块为passwd的状态信息。
如果随便指定一个不存在的文件:
ansible web -m stat -a "path=/etc/bucunzai"
exists判断是否存在,发现为false不存在。
9.unarchive模块:
copy默认为yes,拷贝的文件是从ansilbe主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件remote_src和copy功能一样互斥。
解压功能,将ansible主控端解压到远端主机上去。
例如我们在主控端下载nginx-1.18.0.tar.gz安装包,解压到远端/opt/下
下载:[root@Node1 data]#:wget http://nginx.org/download/nginx-1.18.0.tar.gz
命令:ansible web -m unarchive -a "src=/data/"
在远端查看:7-3也同理
10.archive模块:
压缩的功能。将主控端的的文件压缩到远端指定的目录中。
例如将主控端的/var/log/下的所有文件打包压缩到远端,
命令:[root@Node1 ansible]#:ansible web -m archive -a "path=/var/log dest=/data/alllog.gz"
远端查看:7-3也一样
11.hostname模块:
功能:管理主机名
ansible web -m hostname -a "name=ansible"
验证:发现已经该名成了ansible主机名了
12.cron模块:
功能:计划任务。
有hour,minute,weekday,name,job等关键字。
name是注释信息,在"jobs":[create]
准备一个脚本文件:
在2小时30分,周一到周五执行一次脚本,为在/opt/下创建一个a.sh文件。
发现已经执行成功了。
13.yum和atp模块:
name参数:必须参数,用于指定需要管理的软件包,安装latest,present。卸载absent。
例:安装httpd
ansible web -m yum -a "name='httpd' state=present"
远端查看:
删除httpd:
ansible web -m yum -a "name='httpd' state=absent"
验证卸载了:
但这里,仅仅是把httpd卸载了,依赖包还在。不建议这样删除
14.yum_repository模块:
功能:建立yum仓库模块
name参数,指定要操作的唯一的仓库ID
baseurl参数,设置yum仓库的baseurl
file参数,用于设置仓库的配置文件名称
description参数,设置仓库的配置文件的名称
gpgcheck参数,用于设置是否开启rpm包验证功能,默认为no,表示不用包验证
ansible web -m yum_repository -a 'name=epel description=epel baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no file=epel'
15.service模块:
功能用于管理服务
name参数,用于指定需要操作的服务名称,比如nginx
state参数,用于指定服务的状态
enabled参数,用于指定是否将服务设置为开机启动项。yes开机,no不会开机
在远端下载http服务,
yum install -y httpd
systemctl status httpd,查看状态,发现未启动
启动httpd服务:[root@Node1 ansible]#:ansible web -m service -a "name=httpd state=started"
验证:已启动
state=stopped是关闭服务。
16.user模块:
comment 用户的描述信息
createhome 是否创建家目录
group 指定基本组
groups 指定附加组
home 指定用户家目录
name 指定用户名
shell 指定默认shell
state 设置账号状态,不指定为创建
system 创建一个系统用户
uid 指定用户uid
ansible web -m user -a "name=user1 createhome=no uid=10000 group=root" #创建用户user1,指定uid,不建立家目录,指定基本组。
验证:
17.group模块:
功能:管理组
创建组:ansible web -m group -a "name=nginx gid=88 system=yes"
查看验证
删除组:ansible web -m group -a "name=nginx state=absent"
18.reboot模块:
ansible web -m reboot
重启:
19.steup模块:
有许多模块:
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup -a "filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_uptime_seconds"
ansible all -m setup -a "filter=ansible_processor*"
ansible all -m setup -a 'filter=ansible_env'
查看IP:
----end----