ansible的编排引擎可以出色的完成各种配置管理,ansible在流程控制,资源部署方面很强大,并且ansible无需安装客户端软件,使用yaml配置文件语法,功能强大,便于维护
# 1.在管理端服务器中安装ansible,推荐使用yum安装形式,前提yum、epel源必须配好
yum install epel-release -y
yum install -y ansible libselinux-python
# 2.检查ansible的安装情况
rpm -ql ansible | grep -E '^/etc|^/usr/bin' #yum安装的配置信息一般在/etc目录中,可执行命令/usr/bin
# 3.检查ansible版本
ansible --version
安装ansible 所需的系统模块
# 1.先更新一下epel源和lib模块,再做其他操作
yum install -y epel-release libselinux-python
ansible批量管理主机的方式主要由两种,
# 配置好ansible的配置文件,添加被管理机器的ip地址,或者主机名
# 1. 备份好现有的配置文件
cp /etc/ansible/hosts{,.bak}
# 2.添加ansible需要管理的机器地址,添加如下信息
[root@chenjian01 ~]# tail -2 /etc/ansible/hosts
[webserver]
114.116.107.193
[root@chenjian /etc/ansible]#ansible web --list-hosts
hosts (1):
114.116.107.193
ansible是直接利用linux本地的ssh服务,以及一些远程的ssh操作,一般情况下客户端的ssh服务默认都是开启的,无需额外管理
# 1.在管理机器上执行如下命令
# -m 指定功能模块 -a "执行命令" -k 询问密码验证 -u 指定运行的用户
# 在管理机器上,告诉被管理机器,你要执行什么命令,以及用什么用户去执行
ansible webserver -m command -a "hostname" -k -u root
# 2.如上操作,一般默认情况下会由错误提示,需要执行如下动作,第一种方法只需要手动ssh对主机进行一次连接,即可使用ansible
ssh [email protected]
exit
# 2.1 第二种方法就是更改ansible里面的配置即可
vim /etc/ansible/ansible.cfg
## 取消注释为
host_key_checking=false
# 3.此时可以再次执行ansible命令,即可得到结果
ansible webserver -m command -a "hostname" -k -u root
# 4.可能会被管理机器不是root用户,而是普通用户的情况,且普通用户执行需要提权sudo操作
-u 指定用户
-k 指定连接ssh密码
--become 提权
--become-user 提权到root用户
--ask-become-pass 提权用户输入密码
ansible webserver -m command -a "ls /root" -k -u user --become --become-user root
--ask-become-pass
每次执行ansible命令的是否,都需要输入ssh认证密码,也就是root密码,如果不同主机密码不一致,那你还得输入多次密码才行
# 1. 可以在/etc/ansible/hosts文件中,定义好密码即可,可实现快速认证,选择管理主机
参数
ansible_host 主机地址
ansible_port 端口,默认为22
ansible_user 认证的用户
ansible_ssh_pass用户认证的密码
使用hosts文件的参数形式,来实现ssh认证
[root@chenjian01 ansible]# tail -2 /etc/ansible/hosts
[webserver]
114.116.107.193 ansible_user=root ansible_ssh_pass=Cch109731
# 此时可以再次执行ansible命令,即可得到结果,不需要输入密码就可以得出结果
ansible webserver -m command -a "hostname"
# 1.在管理机器上创建ssh密钥对
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
# 2.此时检查公私钥文件
[root@chenjian01 .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
编写公钥分发脚本
#!/bin/bash
rm -rf ~/.ssh/id_rsa*
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1
SSH_Pass=Cch109731 #远程连接的主机密码
Key_Path=~/.ssh/id_rsa.pub
for ip in 138 139
do
sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.178.$ip
done
# 非交互式分发公钥命令需要用sshpass指定SSH密码,-i 指定公钥文件,通过-o StrictHostKeyChecking=no 跳过SSH连接确认信息
此时在管理机器上再次连接客户端机器,就无需输入账号和密码了,可以尝试使用ansible命令进行连接
ansible webserver -m command -a "uname -a"
此时无需输入密码,即可远程管理
ansible 实现批量化主机管理的模式,主要由两种:
ansible的ad-hoc模式是ansible,也就是处理一些临时的,简单的任务,可以直接用ansible的命令行来操作
比如:
ansible的playbook模式是针对比较具体,且比较大的任务,那么就得写好剧本
ansible webserver -m command -a “hostname”
## 列出所有的ansible支持的模块
ansible-doc -l | grep ^command
## 查看某个模块的具体用法参数
ansible-doc -s command
作用:在远程节点上执行一个命令
chdir 在执行命令之前,先通过cd进入该参数指定的目录
creats 在创建一个文件之前,判断该文件是否存在,如果存在了则跳过前面的东西,如果不存在则执行前面的动作
free_form 该参数可以输入任何的系统命令,实现远程执行和管理
removes 定义一个文件是否存在,如果存在则执行前面的动作,如果不存在则跳过动作
command模块是ansible的默认基本模块,也可以省略不写,不能出现特殊符号>
获取所有被管理机器的负载信息
ansible webserver -m command -a "uptime"
chdir参数
先切换到/tmp,然后再打印工作目录
ansible webserver -m command -a "pwd chdir=/tmp/"
creats参数
该参数作用是判断该文件是否存在?存在则跳过,不存在则执行
# 判断/tmp文件夹是否存在?存在则不执行前面的pwd动作,不存在,则执行pwd
ansible webserver -m command -a "pwd creats=/tmp/"
removes实践
存在则执行,不存在则跳过
ansible webserver -m command -a "pwd removes=/tmp/"
# src代表本地源文件
# dest代表目标路径
ansible webserver -m copy -a "src=nginx-1.15.3.tar.gz dest=/tmp/" -u root
# 创建文件
ansible web -m file -a "dest=/emp/abc mode=600 state=touch" -u root
# 删除文件
ansible web -m file -a "dest=/emp/abc state=absent" -u root
# yum下载软件相当于执行yum install -y memcached
ansible webserver -m yum -a "name=memcached state=present" -u root
# yum卸载软件 相当于执行了 yum remove -y memcached
ansible webserver -m yum -a "name=memcached state=absent" -u root
# 添加用户并设置密码
ansible web -m user -a "name=foo password=123com" -u root
# 删除用户
ansible web -m user -a "name=foo state=absent" -u root
# 创建一个用户但是不允许登录nologin
ansible web -m user -a "name=foo password=123com shell=/sbin/nologin" -u root
# dest代表的是代码克隆到指定的位置
ansible web -m git -a "repo=https://github.com/ansible/ansible.git dest=/tmp/ansible" -u root
# 开启memcached服务,在被管理机器用ps -ef 可以看到效果
ansible web -m service -a "name=memcached state=started" -u root
# 停止memcached服务,在被管理机器用ps -ef 可以看到效果
ansible web -m service -a "name=memcached state=stopped" -u root
# 重启memcached服务,在被管理机器用ps -ef 可以看到效果
ansible web -m service -a "name=memcached state=restarted" -u root
# 设置服务开机自启动
ansible web -m service -a "name=memcached enabled=true" -u root
# 收集目标主机信息
ansible web -m setup
#从主机信息中过滤一些需要的信息
ansible web -m setup -a "filter=ansible_nodename"
# 常用的一些变量
ansible_nodename
ansible_os_family
ansible_pkg_mgr
ansible_processor
作用:再远程机器上执行命令(复杂命令)
了解模块用法的渠道
shell模块支持的参数和解释
chdir 在执行命令之前,通过cd进入该参数指定的目录
creats 定义一个文件是否存在,如果存在则跳过,如果存在该文件,则执行shell命令
free_form参数信息中可以输入任何的系统命令,实现远程管理
removes 定义一个文件是否存在?如果存在该文件,则执行命令,如果不存在,则跳过
批量查询进程信息
ansible webserver -m shell -a "ps -ef | grep vim | grep -v grep"
批量在客户端机器,创建写入文件信息
ansibel webserver -m shell -a "echo 你真棒 > /tmp/heihei.txt"
批量执行脚本
该需要执行的脚本,必须要求客户端机器上存在,否则会报错文件不存在,这是shell模块的特点,是因为还有一个专门执行脚本的script模块
# 1.创建文件夹
# 2.创建sh脚本文件,还要写入脚本内容
# 3.赋予脚本可执行权限
# 4.执行脚本
# 5.忽略warn信息
ansible webserver -m shell -a "mkdir -p /server/myscripts/;echo 'hostname' > /server/myscripts/hostname.sh;
chmod +x /server/myscripts/hostname.sh;bash /server/myscripts/hostname.sh warn=false"
功能:把管理机器上的脚本远程的传输到被管理机器节点上去执行,比起shell模块,script模块的功能更强大,在管理机器上有一份脚本,就可以在所有被管理节点上去运行
script的模块参数
应用案例
mkdir -p /myscript
echo -e "pwd\nhostname" > /myscript/local_hostname.sh
chmod +x /myscript/local_hostname.sh
远程的批量执行脚本,且在客户端不存在该脚本
ansible webserver -m script -a "/myscript/local_hostname.sh"
利用script模块,可以批量让所有被管理机器执行脚本,且该脚本不需要再客户端存在。
特点:易读的编排语言-YAML,非常适合配置管理和应用部署,非常适合部署复杂的工作