文章目录
1、Ansible的安装条件
Ansible 是用Python开发的,可以工作在Linux、BSD、Mac OS X 等平台,对Python环境的版本最低要求为Python2.6以上,目前centos7默认自带的Python是2.7.5,所以在centos7上安装Ansible时无需升级Python,但是如果安装在centos6或者更低版本的linux系统上,需要先升级Python到2.6以上。
特别提醒,升级python版本要慎重,因为yum等重要软件依赖它的特定版本。
2、centos7上升级Python过程(一般不建议升级)
CentOS 7 默认的python版本是python2.7.5。因为yum依赖于默认的python版本的缘由,所以要先保留默认版本,并修改yum文件头部后,才能开始安装更新python2和python3两个最新版本。(python2和python3共存)
保留默认python版本2.7.5,并修改yum头部,保持yum对默认版本python2.7.5的依赖。步骤如下:
1.su root # 获取root权限
2.mv /usr/bin/python2.7 /usr/bin/python2.7.5 # 保留默认版本python为python2.7.5
ln -s /usr/bin/python2.7.5 /usr/local/bin/python2.7.5 # 创建软连接
3.ll /usr/bin/yum* # 查看/usr/bin/目录下所有yum文件(7个)头部
4.vi /usr/bin/yum* # 修改/usr/bin/目录下所有yum文件(7个)头部
#!/usr/bin/python —> #!/usr/bin/python2.7.5
5.vi /usr/libexec/urlgrabber-ext-down # 修改/usr/libexec/目录下 urlgrabber-ext-down头部
#!/usr/bin/python —> #!/usr/bin/python2.7.5
3、安装epel-release源
yum list|grep epel-release
看一下是否有 epel源;
如果显示如上图说明有,就可以直接yum install epel-release -y
安装,
如果没有,先执行如下语句添加源
rpm -Uvh http://mirrors.aliyun.com/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
然后再yum install epel-release -y
安装
4、安装Ansible
Ansibl的安装比较简单,在安装好epel源后可以直接yum方式安装Ansibl了。
命令:yum install ansible -y
Ansible工具默认主目录为:/etc/ansible/
,其中
hosts
文件为被管理机IP或者主机名列表;
ansible.cfg
为ansible主配置文件;
roles
为角色或者插件路径,默认该目录为空。
5、修改hosts文件,添加被管理机器的IP
vim /etc/ansible/hosts
6、Ansible主要模块的应用
6.1、ping 模块
批量 ping服务器的状态 ansible -k all -m ping
初始运行ansible的ping模块,一般会报如下错:
上面的错误信息的主要原因是我们已经开始远程到hosts列表的服务器上;在我们 SSH 到服务器上的时候,SSH 会提示是否需要保存 key,这个时候我们需要选择 Yes 或者 No。但Ansible 是不具备输入参数的能力的。
解决办法1:按照图片中的将各个服务器远程登录一边,但是只能临时使用重启后不管用。
解决办法2:修改配置文件/etc/ansible/ansible.cfg
需要将 host_key_checking 这个配置设置为 False。
部分命令参数解释:
ansible
: 这是 Ansible 命令的名称,用于执行与远程主机通信的操作。-k
: 这是一个选项,表示在连接远程主机时需要提示输入密码。当你希望使用SSH密码进行连接时,可以使用这个选项。all
: 这是指定在主机清单中的所有主机都会受到这个命令的影响。-m command
: 这是指定使用 Ansible 的 “command” 模块来执行命令。“command” 模块允许在远程主机上执行特定的命令。
6.2、command 模块
command 模块需要用到的参数:
参数 | 解释 |
---|---|
ansible | 这是 Ansible 命令的名称,用于执行与远程主机通信的操作。 |
-k | 这是一个选项,表示在连接远程主机时需要提示输入密码。当你希望使用SSH密码进行连接时,可以使用这个选项。 |
-i /etc/ansible/hosts | 这是一个选项,指定 Ansible 使用的主机清单文件的路径。主机清单文件包含了你想要管理的远程主机的信息,比如主机名或IP地址。 |
all | 这是指定在主机清单中的所有主机都会受到这个命令的影响。 |
-m command | 这是指定使用 Ansible 的 “command” 模块来执行命令。“command” 模块允许在远程主机上执行特定的命令。 |
-a “date” | 这是一个选项,表示要传递给 “command” 模块的参数。在这里,你传递的命令是 date ,这会在远程主机上执行 date 命令,显示当前的日期和时间。 |
6.2.1、获取远程主机的日期和时间
命令ansible -k -i /etc/ansible/hosts all -m command -a "date"
6.2.2、远程批量执行ping命令
命令 ansible -k all -m command -a "ping -c 1 www.baidu.com"
192.168.88.134没有配置DNS所以无法ping通百度,修改DNS后再次测试
修改DNS所在文件vim /etc/resolv.conf
添加 nameserver 202.102.134.68
DNS 要选择好用的,我是选择本地联通的DNS。
6.2.3、批量对被管理主机使用df -h命令
命令 ansible -k 192.168.88.* -m command -a "df -h"
6.3、copy模块
Ansible copy模块主要用于文件或者目录拷贝,支持文件、目录、权限、用户组功能
参数 | 作用 |
---|---|
src | Ansible端源文件或者目录,空文件夹不拷贝; |
content | 用来替代src,用于将指定文件的内容,拷贝到远程文件内; |
dest | 客户端目标目录或者文件,需要绝对路径; |
backup | 拷贝之前,先备份远程节点上的原始文件; |
directory_mode | 用于拷贝文件夹,新建的文件会被拷贝,而老旧的不会被拷贝; |
follow | 支持link文件拷贝; |
force | 覆盖远程主机不一致的内容; |
group | 设定远程主机文件夹的组名; |
mode | 指定远程主机文件及文件及的权限; |
owner | 设定远程主机文件夹的用户名。 |
6.3.1、批量给目标主机建目录拷贝文件
先批量远程创建目录 :
ansible -k all -m command -a "mkdir -p /data/ansibletest"
批量拷贝文件到目标主机:
ansible -k all -m copy -a 'src=/data/ansible.txt dest=/data/ansibletest/ mode=755 owner=root'
去目标主机查看文件:
6.3.2、批量远程拷贝文件内容
命令:
ansible -k all -m copy -a 'content="你好ansible" dest=/data/ansibletest/ansible.txt mode=755 owner=root'
去目标主机查看:
再次执行一次命令
ansible -k all -m copy -a 'content="你好ansible我i已经改变" dest=/data/ansibletest/ansible.txt mode=755 owner=root'
再次查看目标主机:结果新内容覆盖了旧的内容
6.3.3、拷贝内容时增加备份功能
命令:
ansible -k all -m copy -a 'content="Hello World------------" dest=/data/ansibletest/ansible.txt backup=yes mode=755 owner=root'
注意:只有前后两次拷贝的内容不一致时才会产生备份
6.4 、yum 模块
Ansible yum模块主要用于软件的安装、升级、卸载,支持红帽.rpm软件的管理,YUM模块使用详解:
参数 | 解释 |
---|---|
conf_file | 设定远程yum执行时所依赖的yum配置文件 |
disable_gpg_check | 安装软件包之前是否坚持gpg key; |
name | 需要安装的软件名称,支持软件组安装; |
update_cache | 安装软件前更新缓存; |
enablerepo | 指定repo源名称; |
skip_broken | 跳过异常软件节点; |
state | 软件包状态,包括:installed、present、latest、absent、removed; |
6.4.1、批量远程安装软件
命令:
ansible all -k -m yum -a "name=sysstat,screen state=installed"
name表示需安装的软件名称,state表示状态,常见state= installed表示安装软件
去目标主机查看:
6.4.2、批量远程删除软件
命令
ansible all -k -m yum -a "name=sysstat,screen state=absent"
name表示需安装的软件名称,state表示状态,常见state= absent 表示安装软件
去目标主机查看:
6.5、file 模块
file模块主要用于对文件的创建、删除、修改、权限、属性的维护和管理
参数 | 解释 |
---|---|
src | Ansible端源文件或者目录; |
follow | 支持link文件拷贝; |
force | 覆盖远程主机不一致的内容; |
group | 设定远程主机文件夹的组名; |
mode | 指定远程主机文件及文件及的权限; |
owner | 设定远程主机文件夹的用户名; |
path | 目标路径,也可以用dest,name代替; |
state | 状态包括:file、link、directory、hard、touch、absent; |
attributes | 文件或者目录特殊属性; |
远程批量创建目录:
命令
ansible -k 192.168.* -m file -a "path=/data/ansibletest/`date +%F` state=directory mode=755"
path表示目录的名称和路径, state=directory表示创建目录;如果创建文件则用state=touch
去目标主机上验证:
6.6、user 模块
user模块主要用于操作系统用户、组、权限、密码等操作
参数 | 解释 |
---|---|
system | 默认创建为普通用户,为yes则创建系统用户; |
append | 添加一个新的组; |
comment | 新增描述信息; |
createhome | 给用户创建家目录; |
force | 用于删除强制删除用户; |
group | 创建用户主组; |
groups | 将用户加入组或者附属组添加; |
home | 指定用户的家目录; |
name | 表示状态,是否create、remove、modify; |
password | 指定用户的密码,此处为加密密码; |
remove | 删除用户; |
shell | 设置用户的shell登录环境; |
uid | 设置用户id; |
update_password | 修改用户密码; |
state | 用户状态,默认为present表示新建用户; |
6.6.1、批量给远程主机建新用户
命令:
ansible -k 192.168.88.* -m user -a "name=ansible home=/tmp/"
name表示用户名称,home表示其家目录 默认使用/bin/bash 也可以指定shell,如shell=/sbin/nologin
验证:
6.6.2、批量删除远程主机用户
ansible -k 192.168.88.* -m user -a "name=ansible state=absent"
name表示用户名称,state=absent表示删除用户 也可以加上强制删除 force=yes
验证:
6.7、cron 模块
cron模块主要用于添加、删除、更新操作系统Crontab任务计划(定时任务)
参数 | 解释 |
---|---|
name | 任务计划名称; |
cron_file | 替换客户端该用户的任务计划的文件; |
minute | 分( 0-59 ,* , */2 每2分钟); |
hour | 时( 0-23 ,* , */2 每2小时 ); |
day | 日( 1-31 ,* ,*/2 ); |
month | 月( 1-12 ,* ,*/2 ); |
weekday | 周( 0-6 或 1-7 ,* ); |
job | 任何计划执行的命令,state要等于present; |
backup | 是否备份之前的任务计划; |
user | 新建任务计划的用户; |
state | 指定任务计划present、absent; |
6.7.1、给远程主机制定批量授时任务
命令:
ansible -k all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' job='/usr/sbin/ntpdate 210.72.145.44'"
minute=0 : 0分
hour=0 : 0点
*:每天/每月/每周
如果需要备份之前的任务计划可以使用backup=yes
ansible -k all -m cron -a "minute=0 hour=0 day=* month=* weekday=* name='Ntpdate server for sync time' backup=yes job='/usr/sbin/ntpdate 210.72.145.44'"
6.7.2、批量删除任务计划
命令:
ansible -k all -m cron -a "name='Ntpdate server for sync time' state=absent"
6.8、synchronize 模块
synchronize模块主要用于目录、文件同步,基于Rsync命令同步目录
参数 | 解释 |
---|---|
compress | 开启压缩,默认为开启; |
archive | 是否采用归档模式同步,保证源和目标文件属性一致; |
checksum | 是否效验; |
dirs | 以非递归的方式传输目录; |
links | 同步链接文件; |
recursive | 是否递归yes/no; |
rsync_opts | 使用rsync 的参数; |
copy_links | 同步的时候是否复制连接; |
delete | 删除源中没有而目标存在的文件; |
src | 源目录及文件; |
dest | 目标目录及文件; |
dest_port | 目标接受的端口; |
rsync_path | 服务的路径,指定 rsync 命令来在远程服务器上运行; |
rsync_timeout | 指定rsync操作的IP超时时间; |
set_remote_user | 设置远程用户名; |
–exclude=*.log | 忽略同步.log结尾的文件; |
mode | 同步的模式,rsync同步的方式PUSH、PULL,默认都是推送push; |
6.8.1、批量同步文件内容
命令:
ansible -k all -m synchronize -a 'src=/data/ansible.txt dest=/data/ansibletest/ansible.txt'
同步前:
执行命令:ansible -k all -m synchronize -a 'src=/data/ansible.txt dest=/data/ansibletest/ansible.txt'
验证:
6.8.2、synchronize模块同步文件夹
同步文件夹前
执行命令:
ansible -k all -m synchronize -a 'src=/data/ dest=/data/ansibletest/ compress=yes delete=yes rsync_opts=--no-motd,--exclude=ansibe'
compress=yes开启压缩、delete=yes数据一致(删除源中没有而目标存在的文件;)、rsync_opts同步参数、–exclude排除文件
同步后验证:
6.9、shell 模块
shell模块主要用于远程客户端上执行各种Shell命令或者运行脚本,远程执行命令通过/bin/sh环境来执行,支持比command更多的指令
参数 | 解释 |
---|---|
chdir | 执行命令前,切换到目录; |
creates | 当该文件存在时,则不执行该步骤; |
executable | 换用shell环境执行命令; |
free_form | 需要执行的脚本; |
removes | 当该文件不存在时,则不执行该步骤; |
warn | 如果在ansible.cfg中存在告警,如果设定了False,不会警告此行; |
6.9.1、远程执行脚本
注意:远程执行脚本,需要提前在目标机器上放一份脚本才可以。
在本地建脚本test.sh
将脚本批量传到目标机器上:
ansible -k all -m copy -a 'src=/data/test.sh dest=/data/ansibletest/ backup=yes mode=755 owner=root'
执行命令:ansible -k all -m shell -a "/bin/sh /data/ansibletest/test.sh >>/tmp/var.log"
“>>/tmp/var.log”表示把输出结果追加到/tmp/var.log文件中
6.9.2、远程批量查看客户端进程
命令:ansible -k all -m shell -a "ps -ef |grep http"
6.9.3、远程批量查看客户端任务计划
命令:ansible -k all -m shell -a "crontab -l"
6.9.4、远程创建目录
命令:
ansible -k all -m shell -a "mkdir -p `date +%F` chdir=/data/ansibletest/ state=directory warn=no"
注释:执行之前切换在/data/ansibletest/目录,屏蔽警告信息
执行结果:
6.10、 Shell模块和command模块的区别
1)command 模块
command模块用于在远程主机上执行简单的命令,这些命令不需要使用 shell 进程来解释。它会直接执行你提供的命令,不会进行任何 shell 扩展或变量替换。
这意味着如果你在 command
模块中使用变量,它们不会被展开,而会直接传递给远程主机执行。
由于不涉及 shell,command
模块执行起来通常更快,也更适用于不需要 shell 功能的简单命令。
2)shell 模块
shell 模块用于在远程主机上执行需要使用 shell 解释的命令,比如使用通配符、管道、重定向等 shell 特性的命令。
这个模块会将你提供的命令传递给远程主机的默认 shell(通常是 /bin/sh
或类似的 shell)来解释执行。这意味着你可以使用变量和 shell 特性。
由于涉及了 shell 解释,shell
模块执行起来可能会稍微慢一些,而且需要注意潜在的安全问题,比如命令注入漏洞。
在选择使用 command
模块还是 shell
模块时,考虑以下几点:
如果你只需要执行简单的命令,而不涉及变量或复杂的 shell 特性,那么使用 command
模块可能更合适,因为它执行得更快。
如果你的命令需要使用变量、管道、重定向等 shell 功能,那么你可能需要使用 shell
模块。
无论使用哪个模块,都要确保在执行命令时处理好输入的数据,以避免安全风险。
在大多数情况下,如果命令比较简单且不需要 shell 功能,建议使用 command
模块。如果需要 shell 功能,确保命令安全并避免潜在的漏洞。
6.11、service 模块
service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等
参数 | 解释 |
---|---|
enabled | 是否开启启动服务; |
name | 服务名称; |
runlevel | 服务启动级别; |
arguments | 服务命令行参数传递; |
state | 服务操作状态,状态包括started, stopped, restarted, reloaded; |
6.11.1、批量远程重启zabbix-agent服务
命令:
ansible -k all -m service -a "name=zabbix-agent state=restarted"
我的目标主机只有192.168.88.134安装了nginx;
192.168.88.169和192.168.88.118没有安装nginx,所以这两台机器返回结果是failed。
192.168.88.134上的zabbix-agent服务重启前:
192.168.88.134上的zabbix-agent服务重启后:
6.11.2、批量远程重启网卡服务
命令:ansible -k all -m service -a "name=network args=ens33 state=restarted"
注释:centos7默认网卡名字是ens33
6.11.3、批量远程开机启动zabbix-agent服务
命令:
ansible -k all -m service -a "name= zabbix-agent enabled=yes runlevel=3,5"