Ansible基础
Ansible基础
Ansible介绍
什么是ansible
Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命
令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
同类型软件对比
1.puppet 学习难,安装ruby环境难,没有远程执行功能
2.ansible 轻量级,大规模环境下只通过ssh会很慢,串行的
3.saltstack 一般选择salt会使用 C/S 结构的模式, salt-master 和 salt-minion ,并行的,大规模批量操作的情况
下,会比Ansible速度快一些,底层使用的是 zero-MQ 消协队列
自动化运维优势
1.提高工作效率
2.提高工作准确度
3.减少维护成本
4.减少重复性工作
Ansible优缺点
优点
1.远程执行 批量执行远程命令,可以对多台主机进行远程操作
2.配置管理 批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
3.事件驱动 通过Ansible的模块,对服务进行不同的事件驱动
比如: 1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理
4.管理公有云 通过API接口的方式管理公有云,不过这方面做的不如 saltstack . saltstack本身可以通过saltcloud管
理各大云厂商的云平台。
5.二次开发 因为语法是Python,所以便于运维进行二次开发。
6.任务编排 可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
7.跨平台,跨系统 几乎不受到平台和系统的限制,比如安装 apache 和启动服务
缺点
1.受到ssh的限制,一旦ssh无法启动,ansible也就无法运行
2.串行执行任务,遇到千级服务器时运行较慢
Ansible的架构

模块
1、连接插件 connection plugins 用于连接主机 用来连接被管理端
2、核心模块 core modules 连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块 custom modules 根据自己的需求编写具体的模块
4、插件 plugins 完成模块功能的补充
5、剧本 playbook ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6、主机清单 inventor 定义ansible需要操作主机的范围
注意:最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
Ansible执行流程
1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。
安装ansible
环境准备
| 主机 | 角色 | 外网IP | 内网IP |
|---|---|---|---|
| m01 | Ansible管理端 | 10.0.0.61 | 172.16.1.61 |
| lb01 | Ansible被管理端 | 10.0.0.5 | 172.16.1.5 |
| lb02 | Ansible被管理端 | 10.0.0.6 | 172.16.1.6 |
| web01 | Ansible被管理端 | 10.0.0.7 | 172.16.1.7 |
| web02 | Ansible被管理端 | 10.0.0.8 | 172.16.1.8 |
| nfs | Ansible被管理端 | 10.0.0.31 | 172.16.1.31 |
| backup | Ansible被管理端 | 10.0.0.41 | 172.16.1.41 |
| db01 | Ansible被管理端 | 10.0.0.51 | 172.16.1.51 |
安装
# 1.安装ansible
[root@m01 ~]# yum install -y ansible
# 2.ansible的配置文件
[root@m01 ~]# vim /etc/ansible/ansible.cfg
# 3.ansible配置文件读取顺序
1、$ANSIBLE_CONFIG
2、./ansible.cfg
3、~/.ansible.cfg
4、/etc/ansible/ansible.cfg
# 4.ansible配置文件
[root@m01 ~]# cat /etc/ansible/ansible.cfg
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
#poll_interval = 15 #对于Ansible中的异步任务, 这个是设置定义,当具体的pollinterval 没有定义时,多少时间回查一下这些任务的状态, 默认值是一个折中选择15秒钟.这个时间是个回查频率和任务完成叫回频率和当任务完成时的回转频率的时钟。
host_key_checking = False #跳过检查主机指纹
log_path = /var/log/ansible.log #ansible日志
Ansible Inventory(主机清单)
/etc/ansible/hosts 是ansible默认主机资产清单文件,用于定义被管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。Inventory文件中填写需要被管理的主机与主机组信息。还可以自定义Inventory主机清单的位置,使用-i指定文件位置即可。
ansible 语法
anisble [主机名] -m 指定模块
ansible all -m ping
ansible连接方式
---------------------------------------方式一:基于密码连接 ----------------------------------------
[root@m01 ~]# vim /etc/ansible/hosts
[zls_web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
[zls_db]
172.16.1.51 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
[zls_lb]
172.16.1.5 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
172.16.1.6 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
[zls_nfs]
172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
[zls_backup]
172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
--------------------------------------方式二:基于主机名连接(变量) ----------------------------------
[webs]
web0[1:2]
[webs:vars]
ansible_ssh_pass='1'
ansible_ssh_user=root
ansible_ssh_port=22
-------------------------------------ansible连接方式三:基于秘钥连接 ---------------------------------
# 1.在ansible管理端生成秘钥对
[root@m01 ~]# ssh-keygen
# 2.下发公钥
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.5
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.6
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.51
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.61
# 3.主机清单
[root@m01 ~]# vim /etc/ansible/hosts
[xxx]
172.16.1.7
172.16.1.8
172.16.1.5
172.16.1.6
172.16.1.31
172.16.1.41
172.16.1.51
[root@m01 ~]# ansible xxx -m ping
-------------------------------------方式四:主机名+IP+免密 -------------------------------------------
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[lb_group]
lb01 ansible_ssh_host=172.16.1.5
lb02 ansible_ssh_host=172.16.1.6
[nfs_group]
nfs ansible_ssh_host=172.16.1.31
[bakcup_group]
backup ansible_ssh_host=172.16.1.41
[db_group]
db01 ansible_ssh_host=172.16.1.51
Ansible的常用模块
ansible的执行
ad-hoc
playbook
ansible ad-hoc
ad-hoc:临时的命令,执行后结束,不会保存
** 使用场景**
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等
ad-hoc的命令模式(语法)

语法:
ansible 主机名(主机清单中的主机名或者主机组) -m 模块名 [-a 动作]
ac-hoc返回结果的颜色
绿色:被管理端执行成功,并且结果不会发生改变
黄色:被管理端执行成功,但是结果是变化的
红色:执行失败,注意看报错
ansible帮助手册
ansible-doc 模块名
ansible模块
command
ansible web_group -m command -a '命令(不带特殊符号)'
shell
ansible web_group -m shell -a '命令'
script
# ansible远程执行脚本
ansible web_group -m script -a '/root/a.sh'
ansible软件管理模块
yum
yum
- name:
- 直接指定包名:从仓库安装 yum install httpd
- http:// 从指定URL安装 yum install http://mirrors.aliyun.com/epel/http1.1.rpm
- file:// 从本地安装 类似 yum localinstall /root/http-1.1.rpm
- state
- absent:卸载
- present:安装
- lastest:安装最新版本
- download_only:
- true:只下载不安装
- false:下载并安装
-list
- 包名
"yumstate": "available" 证明包可以安装但是没装
"yumstate": "installed" 已经安装了
exclude=kernel*,foo* #排除某些包
list=ansible #类似于yum list查看是否可以安装
disablerepo="epel,ol7_latest" #禁用指定的yum仓库
yum_repository
## 创建新的仓库配置文件
ansible db01 -m yum_repository -a 'name=local description=xxx baseurl=file:///mnt
gpgcheck=no enabled=yes'
## 创建新的仓库配置,并且文件名和仓库名不同
ansible web01 -m yum_repository -a 'name=local file=zls_local description=xxx
baseurl=file:///mnt gpgcheck=no enabled=yes'
## 追加仓库
ansible lb01 -m yum_repository -a 'name=test2_ansible file=test_ansible
description=xxx baseurl=http://www.baidu.com'
## 删除仓库
ansible lb01 -m yum_repository -a 'name=test2_ansible file=test_ansible state=absent'
yum_repository
- name:仓库名字(如果有file,只是仓库名,如果没有file,文件名和仓库名)
- file:指定仓库的文件名
- description:仓库的描述(name)
- baseurl:仓库的url
- gpgcheck:
- no:不开启 0
- yes:开启 1(默认)
- enabled:
- no:不开启 0
- yes:开启 1 (默认)
copy
## 远程推送文件
ansible nginx -m copy -a 'src=/etc/passwd dest=/root'
copy
- src:指定源文件的路径
- dest:指定目标路径
- owner:指定属主
- group:指定属组
- mode:指定权限
- backup:
- yes:如果目标路径,存在同名文件,就将目标文件备份
- no:不备份直接覆盖(默认)
- content:将指定文本内容覆盖到目标文件中
- remote_src:将命令变成cp
- yes:将源文件,编程远端的源文件(ansible被管理端)
- no:源文件还是本地文件(ansible管理端 默认)
- follow:拷贝软连接
- yes:会将软连接一起拷贝
- no:会生成一个新的软连接文件
file
path:要创建的文件路径
src:链接的源文件(软链接、硬链接)
dest:链接的目标文件(软链接、硬链接)
state:
link:软链接
hard:硬链接
touch:将path当成普通文件创建出来
directory:将path当成目录创建出来
absent:删除指定的文件
file:修改path指定的文件属性
recurse:
yes:递归创建
no:默认
owner:属主
group:属组
mode:权限
# 1.创建普通文件
[root@m01 ~]# ansible all -m file -a 'path=/root/test_ansible.txt state=touch'
# 2.创建目录
[root@m01 ~]# ansible all -m file -a 'path=/root/test_dir state=directory'
# 3.递归创建目录(默认支持)
[root@m01 ~]# ansible all -m file -a 'path=/root/test_dir state=directory'
# 4.recurse 新创建的目录都会修改指定权限,目录中已存在的文件不会被修改
yes:递归修改所有目录下的所有文件权限
no:不改(no)
[root@m01 ~]# ansible web01 -m file -a 'path=/root/1 state=directory owner=www group=www recurse=yes'
# 5.删除目录
[root@m01 ~]# ansible web01 -m file -a 'path=/root/1 state=absent'
# 6.软链接
[root@m01 ~]# ansible web01 -m file -a 'src=/app/nginx-1.20.1 dest=/app/nginx state=link'
get_url
url:指定安装包下载url
dest:指定保存的路径
mode:下载下来之后的权限
[root@m01 ~]# ansible web01 -m get_url -a 'url=http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz dest=/tmp owner=www group=www mode=0755'
ansible服务管理模块:service
name:服务名
state:
started:启动
stopped:停止
restarted:重启
reloaded:重新加载配置文件
enabled:
yes:允许开机自启
no:默认
ansible用户管理模块
user
name:用户名
uid:指定uid -u
group:指定gid或者组名 -g
groups:指定附加组 -G
append:追加,配合-G使用 -a
shell:指定登录的shell -s
comment:指定描述 -c
create_home:是否创建家目录
yes:创建(默认)
no:不创建
generate_ssh_key:是否创建秘钥对
yes:创建
no:不创建(默认)
ssh_key_bits:私钥长度
ssh_key_file:私钥的位置
state:
present:创建用户(默认)
absent:删除用户
remove
yes:将用户的家目录等。。。全部删除 -r
no:默认
# 创建zls用户,并生成公钥和私钥
[root@m01 ~]# ansible web01 -m user -a 'name=zls uid=69 generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'
# 创建mysql 禁止登陆, 不创建家目录
[root@m01 ~]# ansible web01 -m user -a 'name=mysql shell=/sbin/nologin create_home=no'
group
name:指定组名
gid:指定gid
state:
prensent:创建组(默认)
absent:删除组
[root@m01 ~]# ansible all -m group -a 'name=suibian gid=333 state=present'
ansible定时任务模块:cron
name:注释
分:minute
时:hour
日:day
月:month
周:weekday
job:要执行的任务
state:
present:创建定时任务
absent:删除定时任务(删除任务要根据name)
user:指定定时任务的用户
[root@m01 ~]# ansible all -m cron -a "name='时间同步' minute=*/5 job='/sbin/ntpdate time1.aliyun.com &>/dev/null'"
ansible磁盘挂载模块:mount
path:指定挂载的路径
src:被挂载的路径
fstype:指定文件系统类型
state:
prsent:开机挂载,只写入/etc/fstab
[root@m01 ~]# ansible web01 -m mount -a 'path=/code/wordpress/wp-contend/uploads
src=172.16.1.31:/data/wp_data fstype=nfs state=present'
absent:卸载设备,会清理/etc/fstab写入的配置
[root@m01 ~]# ansible web01 -m mount -a 'path=/code/wordpress/wp-contend/uploads
state=absent'
mounted:既挂载又写入/etc/fstab文件中
[root@m01 ~]# ansible web01 -m mount -a 'path=/code/wordpress/wp-contend/uploads
src=172.16.1.31:/data/wp_data fstype=nfs state=mounted'
unmounted:卸载设备,不会清除/etc/fstab写入的配置
opts:指定挂载的权限
ansible防火墙模块
--------------------------------------selinux-----------------------------------------------
state:
disabled 关闭selinux
[root@m01 ~]# ansible web01 -m selinux -a 'state=disabled'
--------------------------------------firewalld---------------------------------------------
service:根据服务放行端口
port:
端口/tcp
state
disabled:禁用端口
enabled:放行指定端口
[root@m01 ~]# ansible lb02 -m firewalld -a 'port=7001/tcp state=enabled'
[root@m01 ~]# ansible lb02 -m firewalld -a 'service=http state=enabled'
ansible解压模块:unarchive
src:指定源文件
dest:目标路径
remote_src:
yes:压缩包在远端机器上
no:默认 ,压缩包在管理端
注意:前提条件是,被管理端上必须有所有的解压命令
[root@m01 tmp]# ansible lb_group -m unarchive -a 'src=/tmp/pymp-dmy45m_h.zip dest=/usr/local/src'
ansible自动化运维模块:setup
[root@m01 tmp]# ansible all -m setup -a 'filter=ansible_all_ipv4_addresses'
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数)。
ad-hoc实战安装rsync
使用yum安装
# 1.创建基础用户
groupadd www -g 666
useradd www -u 666 -g 666 -s /sbin/nologin -M
# 2.安装rsync
yum install -y rsync
# 3.修改配置文件
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = Backup to Rsync
path = /backup
# 4.创建目录
mkdir /backup
# 5.修改权限
chown www.www /backup
# 6.创建密码文件
echo 'rsync_backup:123' > /etc/rsync.passwd
# 7.修改密码文件权限为600
chmod 600 /etc/rsync.passwd
# 8.启动服务
systemctl start rsyncd
# 9.加入开机自启
systemctl enable rsyncd
使用ansible
# 1.创建基础用户
ansible backup -m group -a 'name=www gid=666 state=present'
ansible backup -m user -a 'name=www uid=666 group=666 shell=/sbin/nologin create_home=no state=present'
# 2.安装rsync
ansible bakcup -m yum -a 'name=rsync state=present'
# 3.修改配置文件
ansible backup -m copy -a 'src=/root/rsyncd.moban dest=/etc/rsyncd.conf owner=root
group=root mode=0644'
#rsync配置文件模板,放在管理端
[root@m01 ~]# cat /root/rsyncd.moban
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
comment = Backup to Rsync
path = /backup
# 4.创建目录
ansible backup -m file -a 'path=/backup owner=www group=www mode=0755 state=directory'
# 5.创建密码文件
ansible backup -m copy -a 'content="rsync_backup:123" dest=/etc/rsync.passwd owner=root group=root mode=0600'
# 6.启动服务
ansible backup -m service -a 'name=rsyncd state=started enabled=yes'
#在ansible管理端生成秘钥对
[root@m01 ~]# ssh-keygen
#下放密钥对
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
#运行脚本
[root@m01 ~]# sh ansible_rsyncd.sh
#验证
[root@nfs ~]# rsync -avz /etc rsync_backup@172.16.1.41::/backup
本文来自博客园,作者:远方还很远,转载请注明原文链接:https://www.cnblogs.com/moqiqingyu/p/15125635.html

浙公网安备 33010602011771号