ansible 之ad-hoc

ansible 特点

ansible的编排引擎可以出色的完成各种配置管理,ansible在流程控制,资源部署方面很强大,并且ansible无需安装客户端软件,使用yaml配置文件语法,功能强大,便于维护

  • ansible是基于Python开发
  • 安装部署简单
  • 管理主机便捷,支持多台主机并行管理
  • 无需安装被管理节点的客户端(no agent),且无需占用客户端其他的端口,仅仅使用ssh服务即可
  • 不仅仅支持python,还支持其他语言的二次开发
  • 不用root用户也可以执行,降低系统权限

ansible实践部署

1.安装ansible,先准备ansible管理机器(老板)

# 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被管理机器(员工)

安装ansible 所需的系统模块

# 1.先更新一下epel源和lib模块,再做其他操作
yum install -y epel-release libselinux-python 

ansible管理方式

ansible批量管理主机的方式主要由两种,

  • 传统的输入ssh密码验证
  • 密钥管理
# 配置好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

ssh密码认证方式管理机器

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密码,如果不同主机密码不一致,那你还得输入多次密码才行

ansible自带的密码参数(安全性太低,不推荐)
# 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"
ssh密钥方式批量管理主机(推荐,必须使用这个)
# 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 实现批量化主机管理的模式,主要由两种:

  • 利用ansible的纯命令行实现的批量管理,ad-hoc模式-----好比简单的shell命令管理
  • 利用ansible的playbook剧本来实现批量管理,playbook剧本模式------好比复杂的shell脚本管理
ad-hoc模式

ansible的ad-hoc模式是ansible,也就是处理一些临时的,简单的任务,可以直接用ansible的命令行来操作

比如:

  • 临时批量查看被管理机器的内存情况,cpu负载情况,网络情况
  • 比如临时的分发配置文件等等
playbook模式

ansible的playbook模式是针对比较具体,且比较大的任务,那么就得写好剧本

  • 一键部署rsync备份服务器
  • 一键部署lnmp环境

ansible的ad-hoc命令模式解析

ansible webserver -m command -a “hostname”

  • Ansible–自带提供的命令操作
  • webserver–/etc/ansible/hosts文件中定义的主机组,还可以写主机ip地址,以及通配符*
  • -m command --ansible指定模块的参数,以及指定了command模块
  • -a 指定给command模块什么参数,hostname,uname -r

ansible-doc命令

## 列出所有的ansible支持的模块
ansible-doc -l | grep ^command
## 查看某个模块的具体用法参数
ansible-doc -s command

Ansible模块精讲

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/"

copy模块

# src代表本地源文件
# dest代表目标路径
ansible webserver -m copy -a "src=nginx-1.15.3.tar.gz dest=/tmp/" -u root

file模块

# 创建文件
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下载软件相当于执行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

user模块

# 添加用户并设置密码
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

git模块

# dest代表的是代码克隆到指定的位置
ansible web -m git -a "repo=https://github.com/ansible/ansible.git dest=/tmp/ansible" -u root

service模块

# 开启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

setup模块

# 收集目标主机信息
ansible web -m setup
#从主机信息中过滤一些需要的信息
ansible web -m setup -a "filter=ansible_nodename"


# 常用的一些变量
ansible_nodename
ansible_os_family
ansible_pkg_mgr
ansible_processor

shell模块

作用:再远程机器上执行命令(复杂命令)

了解模块用法的渠道

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"

script模块

功能:把管理机器上的脚本远程的传输到被管理机器节点上去执行,比起shell模块,script模块的功能更强大,在管理机器上有一份脚本,就可以在所有被管理节点上去运行

script的模块参数

  • creates
  • removes
  • chdir

应用案例

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模块,可以批量让所有被管理机器执行脚本,且该脚本不需要再客户端存在。

playbook模式解析

特点:易读的编排语言-YAML,非常适合配置管理和应用部署,非常适合部署复杂的工作

你可能感兴趣的:(ansible,服务器,linux)