中间件

ansible

admin · 7月2日 · 2020年

一.安装

Ansible是一个开源配置管理工具,可以使用它来自动化任务,部署应用程序实现IT基础架构。Ansible可以用来自动化日常任务,比如,服务器的初始化配置、安全基线配置、更新和打补丁系统,安装软件包等。Ansible架构相对比较简单,仅需通过SSH连接客户机执行任务即可,无需客户端。

  • 首先配置eple, 建议使用阿里OPSX:https://developer.aliyun.com/mirror/
  • 下载eple源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  • 安装ansible
yum install ansible -y
rpm -qa ansible

二.配置说明

  • ansible的默认默认配置文件

查看当前配置文件的命令:

ansible --version
----------------------------------------------------------------------------------------------------------------------------------------
ansible 2.4.2.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
配置文件路径作用域说明优先级
系统级配置文件/etc/ansible/ansible.cfg为系统级别的设定文件,对所有用户起效最低
用户级配置文件~/ansible.cfg为用户级设定文件,对当前用户起效高于系统级配置文件
当前运行应用级配置文件./ansible.cfg当前运行的playbook等所指定的配置文件
对当前执行操作起效
高于用户级配置文件
ANSIBLE_CONFIG
环境变量指定配置文件
export ANSIBLE_CONFIG=
配置文件路径
当前运行的playbook等所指定的配置文件
对当前执行操作起效
高于当前运行应用级配置文件

三.使用场景

1:基于密码的连接

在/etc/ansible/hosts文件中添加组

[server]
172.16.1.131 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='passwd'
172.16.1.132 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='passwd'
172.16.1.133 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='passwd'

ansible server -m ping                 #对server组内的主机使用ping模块
ansible server -m ping -i hosts        #-i hosts 指定hosts文件

2:基于密钥的连接

ssh-keygen                                             #在管理机生成密钥对
ssh-keygen -f ~/.ssh/rsa -P '' -q                      #静默生成密钥对

ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip               #分发公钥
sshpass -p123456 ssh-copy-if -i ~/.ssh/id_rsa.pub "-o StrickHostKeyChecking=no" root@ip

[server]
172.16.1.131
172.16.1.132
172.16.1.133
或
[server]
web01 ansible_ssh_host=ip1 ansible_ssh_port=22         #以别名web01的形式返回信息
web02 ansible_ssh_host=ip2 ansible_ssh_port=22

ansible server -m ping -i host
  • ansible.cfg中修改host_key_checking = False 可解决输入yes/no的指纹认证
  • ansible.cfg中添加interpreter_python = auto_legacy_silent 可解决部分python版本报警

-m 模块名 不加-m时默认为command

-a 模块参数

-f 并发数,默认为5

四.模块的使用

1:command模块

free_form必须参数,指定需要远程执行的命令,free_form不需要赋值
chdir指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。相当于cd命令
creates当指定的文件存在时,就不执行对应命令,比如,如果creates=/etc,当/etc存在,就不执行我们指定的命令
removes当指定的文件存在时,就不执行对应命令,比如,如果removes=/etc,当/etc存在,就执行我们指定的命令
#切换到指定目录并打印
ansible server -m command -a "pwd chdir=/var/log"
#command也可以省略
ansible server  -a "pwd chdir=/var/log"

2.shell模块

free_form必须参数,指定需要远程执行的命令,free_form不需要赋值
chdir指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。相当于cd命令
creates当指定的文件存在时,就不执行对应命令,比如,如果creates=/etc,当/etc存在,就不执行我们指定的命令
removes当指定的文件存在时,就不执行对应命令,比如,如果removes=/etc,当/etc存在,就执行我们指定的命令
executable默认shell模块会调用远程主机中的/bin/sh,远程主机中的默认shell都是bash,
如果你想要使用其他类型的shell执行命令,则使用executable=/bin/csh
#shell模块可以使用管道、重定向等符号
ansible server -m shell -a "ps -ef | grep mysqld"

3.script模块

free_form必须参数,指定需要远程执行的命令,free_form不需要赋值
chdir指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。相当于cd命令
creates当指定的文件存在时,就不执行对应命令,比如,如果creates=/etc,当/etc存在,就不执行我们指定的命令
removes当指定的文件存在时,就不执行对应命令,比如,如果removes=/etc,当/etc存在,就执行我们指定的命令
#在目标机上执行管理机上的脚本文件
ansible server -m script -a "~/test.sh"

4.copy模块

src管理机的目录地址
dest目标机的目录地址
force存在同名文件时,是否强制覆盖 yes强制覆盖,no不复制
backup存在同名文件时,是否备份yes no
owner指定所属用户
group指定所属组
mode指定权限 如0755,或u=rwx,g=rx,o=rx
#将管理机上的文件复制到目标机上
ansible server -m copy -a "src=~/test dest=~/"
#强制覆盖

5.fetch模块

src目标机的目录地址
dest管理机的目录地址
#将远程机上的文件复制到管理机
ansible server -m fetch -a "src=~/test dest=~/"

6.cron模块

minute用于设置计划任务中分钟设定位的值,当不使用此参数时,分钟设定位的值默认为”*”
hour用于设置计划任务中小时设定位的值,当不使用此参数时,分钟设定位的值默认为”*”
day用于设置计划任务中天设定位的值,当不使用此参数时,分钟设定位的值默认为”*”
month用于设置计划任务中月设定位的值,当不使用此参数时,分钟设定位的值默认为”*”
weekday用于设置计划任务中周设定位的值,当不使用此参数时,分钟设定位的值默认为”*”
special_time用来表示@reboot 、@hourly、@daily、@weekly、@monthly、@yearly
user指定执行crontab的用户
job此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如的/root/test.sh
name此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,如#Ansible: test
state当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将 state 的值设置为 absent
#等同于10 2 * * * echo hello
ansible server -m cron -a "name='crontab test' minute=10 hour=2 job='echo hello'"
#开机后执行,等同于@reboot
ansible server -m cron -a "name='special time test' special_time=reboot job='echo hello'"
#删除指定名称的定时任务
ansible server -m cron -a "name='special time test' state=absent"

7.user模块

nameuser的名称
state添加present,删除absent
remove与state=absent一起使用相当于userdel –remove,删除家目录
force与state=absent一起使用相当于userdel –force
group指定组
groups设置附加组
uid设置uid
home设置家目录
password需要用加密密码
update_password修改密码,有always(密码不一致时修改密码)和on_create(只为新用户创建密码)
python
import crypt
crypt.crypt("密码")
#注意在password后加加密后的密码需要对$做转义或使用单引号''包含-a里的内容

a=$(python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))')
ansible note1 -m user -a 'name=testuser password="$a" update_password=always'

8.group模块

namegroup的名称
state添加present,删除absent
gid指定gid
ansible note1 -m group -a 'name=testgroup gid=9999 state=present'

9.yum模块

name包的名称
stateinstalled、present、latest、absent、removed
update_cache安装软件前更新缓存
skip_broken跳过异常软件节点
#安装:installed、present、latest
absible server -m yum -a "name=xxx state=latest"
#卸载:absent、removed
absible server -m yum -a "name=xxx state=removed"