一.安装
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模块
name | user的名称 |
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模块
name | group的名称 |
state | 添加present,删除absent |
gid | 指定gid |
ansible note1 -m group -a 'name=testgroup gid=9999 state=present'
9.yum模块
name | 包的名称 |
state | installed、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"