目录
一、ansible概述
1、简介
2、Ansible主要功能:
3、Ansible的另一个特点:所有模块都是幂等性
4、Ansible的优点:
5、Ansible的四大组件:
二、ansible环境部署:
1、环境:
2、安装ansible:
3、Ansible的配置文件:
4、 配置远程主机清单
三、ansible的模块(重要)
1、ansible的命令格式:
2、模块1:command模块
3、模块二:shell模块
4、模块3:cron模块
5、模块4:USER模块
6、模块5:group模块(了解)
7、模块6:ping模块
8、模块7:hostname模块
9、模块8:COPY模块
10、模块9:file模块
11、模块10:yum模块
12、模块11:service/systemd模块
13、模块12:script模块
14、模块13:setup模块
四、管理主机清单
1、主机变量
2、组变量
3、组嵌套
一、ansible概述
1、简介
Ansible是自动化运维工具,能实现跨主机对应用编排管理部署。
Ansible能批量配置、部署、管理上千台主机,是应用级别的跨主机编排工具。
比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起
2、Ansible主要功能:
远程操控主机功能
自动化运维(playbook剧本yaml格式)
Ansible能批量的配置、部署、管理上千台主机。类似于xshell的一键输入的工具,不需要每次都切换主机进程操作,只要有一台Ansible的固定主机,就可以实现所有节点的操作
不需要agent(客户端)的概念,只需要一台主机上配置了Ansible即可
Ansible是基于模块来进行工作的,只是提供了一种运行的架构,真正执行操作和变更的是Ansible的模块来实现的。
Ansible默认是通过ssh的密钥对实现通信。(可以改)
3、Ansible的另一个特点:所有模块都是幂等性
所谓幂等性,指的是多次操作和多次执行对系统资源的影响是一致的
systemctl stop firewalld 是幂等性
systemctl restart firewalld不是幂等性
http的get是幂等性
http的post不是幂等性
Ansible的幂等性,决定了你可以放心大胆的使用,重复执行摸个任务不会对结果产生任何影响(绝大多数情况)
4、Ansible的优点:
部署较为简单,只要在控制主机部署即可。被控制主机需要有ssh和python2.5以上版本。基本上Linux虚拟机都能满足这两个
Ansible只能控制Linux系统,Windows不行
基于模块工作,可以使用任意语言开发模块(二次开发,底层架构)
5、Ansible的四大组件:
- inventory主机清单(主机组):定义Ansible可以远程操作的服务器
- 模块:常用的有13个模块。通过模块可以实现远程的配置和操作
- plugins插件
- playbook:基本(shell脚本)yaml格式
二、ansible环境部署:
1、环境:
管理端:20.0.0.21 Ansible
被管理端:20.0.0.22、20.0.0.23
2、安装ansible:
基于epel源安装
先安装 epel 源
yum install -y epel-release
yum安装ansible
yum install -y ansible
3、Ansible的配置文件:
/etc/ansible/
ansible.cfg:ansible的主配置文件,一般无需修改
hosts:主机组,声明可以被控制的主机
roles:公共角色目录
4、 配置远程主机清单
修改hosts文件:
vim hosts
配置主机有两种方式:1、直接声明主机的IP地址 2、主机名(要在/etc/hosts中做映射)
主机上生成密钥对并且传给被控制主机:
ssh-keygen -t rsa
配置密钥对验证
ssh-keygen -t rsa #一路回车,使用免密登录
sshpass -p '123' ssh-copy-id root@20.0.0.22
sshpass -p '123' ssh-copy-id root@20.0.0.23
若发送密钥对不成功,先到目标主机上执行一个命令,然后再传
ansible 20.0.0.23 -m command -a 'date'
ansible 20.0.0.22 -m command -a 'date'
三、ansible的模块(重要)
1、ansible的命令格式:
ansible 组名/IP地址 -m 模块名称 -a '参数列表(执行的命令)'
ansible 20.0.0.23 -m shell -a 'touch /opt/123 && echo 123 > /opt/123 && cat /opt/123'
&& 逻辑且,前一个命令成功才会执行下一个命令
ansible 20.0.0.23 -m shell -a 'touch /opt/456 ; ehco 456 > /opt/456 ; cat /opt/456'
;分号表示逻辑或,前面不管成功与否,后面的命令都会执行
ansible不适用交互式的命令
2、模块1:command模块
在远程主机执行Linux命令,不支持管道符,重定向输出
指定IP地址:
ansible 20.0.0.23 -m command -a 'date'
ansible 20.0.0.22 -m command -a 'date'
指定组,组内所有的声明主机都会执行:
ansible webserver -m command -a 'date'
ansible dbservers -m command -a 'date'
所有声明的主机全都执行:
ansible all -m command -a 'date'
不加-m,不声明使用的模块,默认就是command模块:
ansible 20.0.0.23 -a 'date'
command的一些常用参数:
chdir:在远程主机上运行命令,提前进入目录
先进home目录,然后再执行命令
ansible all -m command -a 'chdir=/opt ls'
creates:判断指定文件是否存在,若存在,不执行后续的操作
ansible all -m command -a 'creates=/opt/123 ls/opt'
removes:ansible all -m command -a 'chdir=/opt ls'
ansible 20.0.0.22 -m command -a 'removes=/opt/123 ls/opt'
3、模块二:shell模块
在远程主机上执行命令,相当于远程主机
ansible 20.0.0.22 -m shell -a 'useradd test'
#创建用户test
ansible 20.0.0.22 -m shell -a 'echo 123456 | passwd --stdin test'
#给test用户创建密码
举个例子:将IP地址切片出来:
ansible 20.0.0.22 -m shell -a "echo $(ifconfig ens33 | awk 'NR==2{print $2}')"
在ansible当中,多个引号之间要做隔离
创建脚本,再写入内容,最后执行
举个例子:写一个脚本
ansible 20.0.0.22 -m shell -a 'echo -e "#/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'
4、模块3:cron模块
远程给主机设置定时任务
两种状态: present表示添加(默认就是添加,可以省略)
absent:表示移除。在ansible中absent都可以表示移除的意思(删除)
* * * * * 分时日月周
分=minute
时=hour
日=day
月=month
周=weekday
job:任务计划需要执行的命令或者脚本
name:任务计划的名称,可以不加
ansible 20.0.0.22 -m cron -a 'minute="*/5" job="ls /opt" name=test1'
举个例子:
写一个9月1号8点30分,执行ls /opt 任务名:test2
30 8 1 9 *
ansible 20.0.0.22 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'
查看定时任务:
ansible 20.0.0.22 -m command -a 'crontab -l'
删除定时任务:
ansible 20.0.0.22 -m cron -a 'name=test1 state=absent'
删除未命名的定时任务(所有的None都会删除):
多个定时任务,如果不给名字都是None,一旦删除None,全部删除,不推荐(最好是指定一个不重复的名称)
ansible 20.0.0.22 -m cron -a 'name=None state=absent'
5、模块4:USER模块
用户管理模块
常用的参数:
name 指定用户名,必须要有
state present:创建用户,可以不加,默认
absent :删除一定要加absent
system=yes|no。标记用户使用是一个程序用户
uid:用户的唯一标识
group:指定用户的所在组
create_home=yes|no:替换用户的家目录,不替换可以不写,可省略
password:给用户创建密码
comment:添加用户的注释信息,可有可无
remove=yes|no,当删除用户时,加上remove=yes,删除用户的家目录,相当于userdel -r。如果不需要删除用户家目录,可省略这一项
ansible 20.0.0.22 -m user -a 'name=koeda system=yes '
在创建用户时,虽然我声明了是一个程序用户,但是默认的登录shell如果没有额外的声明,还是默认的/bin/bash,UID会按照程序用户来指定
创建程序用户:
ansible 20.0.0.22 -m user -a 'name=koeda1 system=yes shell=/sbin/nologin'
使用ansible的USER模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash
如果创建程序用户,一定要声明system=yes,声明shell的类型 shell=/sbin/nologin
也可以指定uid的方式,给用户分配一个uid
创建用户,选择uid,创建密码,指定家目录:
ansible 20.0.0.22 -m user -a 'name=koeda3 uid=1010 password=123456 home=/opt/test1'
更改用户家目录:
ansible 20.0.0.22 -m user -a 'name=koeda3 home=/home/koeda3 create_home=yes'
删除用户及其家目录:
ansible 20.0.0.22 -m user -a 'name=koeda remove=yes state=absent'
6、模块5:group模块(了解)
用户组的管理模块
gid 设置组的id
name必须要有
创建用户组:
ansible 20.0.0.22 -m group -a 'name=test1 gid=306 system=yes'
创建用户时添加到指定的组:
ansible 20.0.0.22 -m user -a 'name=test uid=1011 group=test1 '
删除用户组:
ansible 20.0.0.22 -m group -a 'name=test1 state=absent'
7、模块6:ping模块
ansible all -m ping
能ping通的主机必须是声明的主机
只有在/etc/ansible/hosts文件中声明的主机,ansible的控制端才可以进行远程操作
8、模块7:hostname模块
更改被控制端的主机名:
ansible 20.0.0.22 -m hostname -a 'name=webservers'
ansible 20.0.0.23 -m hostname -a 'name=dbservers'
9、模块8:COPY模块
用于复制指定的主机文件到远程主机的模块
常用的参数:
dest:指出要复制的文件在哪,必须使用绝对路径。如果源目标是目录,指目标也得是目录。如果目标的文件存在,会覆盖原有的内容
src:复制文件的源,最好使用绝对路径,源目标是目录,指目标也得是目录
owner:支出文件的所有者
group:指定文件的所在组
content:从主机复制指定的内容到目标主机,用content就不能使用src
mode:指定复制之后的文件的权限
ansible 20.0.0.22 -m copy -a 'src=/opt/123 dest=/opt/123.txt owner=test mode=655'
举个例子:将ky32.txt文件复制到22主机,所有者test程序用户,所在组test,文件的权限600
ansible 20.0.0.22 -m user -a 'name=test system=yes shell=/sbin/nologin'
#创建程序用户
ansible 20.0.0.22 -m group -a 'name=test gid=333 system=yes'
#创建用户组
ansible 20.0.0.22 -m copy -a 'src=/opt/ky32.txt dest=/opt/32.txt owner=guoqi group=guoqi mode=600'
#复制文件,并且给权限
复制目录:
复制目录时,要保证不是空目录,要有文件
ansible 20.0.0.22 -m copy -a 'src=/opt/test dest=/opt/test1/ mode=777'
指定输入一个内容:
相当于echo功能
echo一个hello world!到22主机的opt下
ansible 20.0.0.22 -m copy -a 'content="hello world!" dest=/opt/hello.txt'
10、模块9:file模块
文件模块跟目录没有关系
管理文件属性
相关参数:
owner、group、mode等
state=link:创建链接文件
state=touch:创建文件
state=directory 创建目录
state=absent:删除文件
修改文件的所有者和所在组
ansible 20.0.0.22 -m file -a 'owner=test group=test mode=777 path=/opt/demo.txt'
file模块创建文件
ansible 20.0.0.22 -m file -a 'path=/opt/ky32.txt state=touch'
#创建文件
file模块创建目录
ansible 20.0.0.22 -m file -a 'path=/opt/ky32 state=directory'
将本机的/etc/fatab文件复制到远程主机,再用这个文件创建一个连接文件:
ansible 20.0.0.23 -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak'
#先复制
ansible 20.0.0.23 -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
#在创建链接文件
基于file模式删除远程文件
ansible 20.0.0.23 -m file -a 'path=/opt/fstab.link state=absent'
11、模块10:yum模块
在远程主机上安装软件包
ansible 20.0.0.23 -m yum -a 'name=httpd'
ansible 20.0.0.23 -m yum -a 'name=tree'
在目标主机上的操作都是后台运行,不影响其他用户的使用。在日志中能打印
卸载软件:
ansible 20.0.0.23 -m yum -a 'name=tree state=absent'
12、模块11:service/systemd模块
常用参数:
state=started|stopped|restarted 三种管理动作
enabled=true 表示是否设置开机自启,默认就是开机不自动启动
runlevel:配合enabled的,若设置开机自启,可以设置运行级别。在命令行可以设置,但是不生效,必须要在playbook中使用
ansible 20.0.0.52 -m service -a 'enabled=ture name=nginx state=restarted'
举个例子:nginx 安装nginx 设置为开机自动,设置访问页面this is nginx
ansible 20.0.0.52 -m yum -a 'name=epel-release'
ansible 20.0.0.52 -m yum -a 'name=nginx'
ansible 20.0.0.52 -m service -a 'enabled=true name=nginx state=restarted'
ansible 20.0.0.52 -m shell -a 'echo this is nginx > /usr/share/nginx/html'
13、模块12:script模块
运行本地脚本,然后将结果输出到目标主机
先创建一个脚本
chmod 777 test.sh
运行脚本,将内容输出到远程主机上
ansible all -m script -a 'test.sh'
14、模块13:setup模块
主要作用就是查看目标主机的环境信息(facts),目标节点的系统信息
查看所有环境信息
ansible all -m setup
查看目标主机的IP信息
ansible all -m setup -a 'filter=*ipv4'
查看CPU信息:
ansible all -m setup -a 'filter=*memory*'
ansible_processor
查看内存信息:
ansible all -m setup -a 'filter=*memory*'
ansible_memory_mb
查看内核:
ansible all -m setup -a 'filter=*proc*'
ansible_processor
查看os系统:
ansible all -m setup -a 'filter=*os*'
ansible_os_family
查看硬盘信息:
ansible all -m setup -a 'filter=*dev*'
ansible_devices
四、管理主机清单
快速声明多个主机
vim /etc/ansible/hosts
20.0.0.6[1:3]
#声明主机范围。表示声明20.0.0.61-63主机
取消密钥队免密登录
ansible_host:声明连接时的IP地址
ansible_port:声明对方的连接端口。默认是ssh的默认端口
ansible_user:指定连接时使用对方主机的用户名。不指定表示主机执行ansible的用户即为使用目标主机的用户名
ansible_password:指定连接ssh时的密码。这里是目标主机的用户密码
ansible_become:提升用户权限。也可以改变用户的身份
例如:ansible_become root。需要声明用户的密码
ansible_become-password:指定切换用户的密码。基于免密钥登录实现。
1、主机变量
vim /etc/ansible/hosts
#声明主机变量
#指定ip,定义好ssh连接的端口,用户,密码。做到免密连接
20.0.0.2[5:6] ansible_port=22 ansible_user=root ansible_password=123
这里将25、26主机生面变量,27没有声明
vim /etc/ansible/ansible.cfg
取消ssh的秘钥对验证
#---71行取消注释---
host_key_checking = False
测试连通性:
ansible webservers -m ping
这里注意:
声明好的主机节点的端口必须是22,root用户的密码必须是123
2、组变量
声明组变量
[webservers:vars] #表示为 webservers 组内所有主机定义变量
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22
声明所有的主机都是用相同的用户名密码和端口
[all:vars1] #表示为所有组内的所有主机定义变量
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22
3、组嵌套
[nginx]
20.0.0.20
20.0.0.21
20.0.0.22
[apache]
20.0.0.3[0:3]
[webs:children] #表示为 webs 主机组中包含了 nginx 组和 apache 组内的所有主机
nginx
apache