ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
安装
下载epel源
1 | wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo |
安装ansible
1 | yum install -y ansibleshell |
控制节点需要安装: salt-master
被控节点需要安装: salt-minion
批量在远程主机上执行命令
ansible 是通过ssh来连接并控制被控节点,ssh 的认证方式包括:
密码连接
秘钥连接
1
2ssh-keygen # 用来生成ssh的密钥对
ssh-copy-id 192.168.107.131 # 复制秘钥到远程主机,实现秘钥连接
ansible 命令格式
1 | ansible <host-pattern> [options] |
ansible hosts
1 | cat /etc/ansible/hosts |
host-pattern
1 | hosts中添加: |
ansible-doc查看模块的帮助信息
1 | ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin] |
命令相关模块
command
1 | ansible group -a 'useradd yao' # 通过ansible在group组中的远程主机上执行命令 |
shell
1 | ansible group -m shell -a 'echo "123" | passwd --stdin yao' # 批量创建密码 |
script
1 | ansible group -m script -a '/root/m.sh' # 执行本地/管控机上的文件 |
文件相关模块
copy
相关
模块参数:
backup 备份,以时间戳结尾
dest 目的地址
group 文件的属组
mode 文件的权限 r-4; w-2; x-1
owner 文件的属主
src 源文件
使用
1 | # 通过md5码来判断是否需要复制 |
file
相关
inode 硬盘的地址
id 获取到的是内存的地址
ln -s a.py b.py 创建软连接
ln a.py c.py 创建硬链接
当源文件变化时,软连接和硬链接文件都会跟着变化
使用
1 | ansible group -m file -a 'path=/yao state=directory' # 在远程机器上创建文件夹 |
fetch
相关
模块参数:
dest 目的地址
src 源地址
使用
1 | ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下载被控节点的文件,每台机器创建一个文件夹,并保留原来的目录结构 |
软件相关模块
yum
yum 源配置
1 | name=Extra Packages for Enterprise Linux 7 - $basearch # 名字 |
yum 安装包组
yum grouplist # 查看包组信息
yum groupinstall # 安装包组模块参数:
disablerepo # 禁用源
enablerepo # 启用源
name # 包名state install (present or installed, latest)
state remove (absent or removed)
使用
1 | ansible group -m yum -a 'name=wget' # 安装wget |
ps:rpm 和yum 的区别:rpm:redhat package manager yum
可以解决依赖关系
pip
相关
pip install 安装包
pip freeze > requirements.txt 将python的环境打包到文件中
pip install -r requirements.txt 安装文件中的包
pip list 查看所有的以安装成功的包
使用
1 | ansible group -m pip -a 'name=flask' # 安装flask模块 |
service
相关
1 | ps -ef | grep nginx # 查看进程 |
使用
1 | ansible group -m service -a 'name=nginx state=started' # 启动nginx |
计划任务
cron
相关
模块参数:
day 天
disabled 禁用
hour 小时
job 任务
minute 分钟
month 月
name 任务名字
weekday 周
1 | # crontab使用 |
使用
1 | ansible group -m cron -a 'minute=26 job="touch /tmp/yao.txt" name=touchfile' # 新建一个计划任务 |
用户相关
user
相关
用户:
管理员 : root uid:0
普通用户:
系统用户 不能登录 1-999 centos7 ;1-499 centos6
登录用户 可以登录 1000-65535 centos7 ;500-65535 centos6
用户组:
管理员组 root 0
系统用户组 1-999 centos7 ;1-499 centos6
登录用户组 1000-65535 centos7; 500-65535 centos6
-d 指定用户的家目录
-g 指定用户的组
-G 执行用户的附加组
-s 指定登录后使用的shell
-r 创建一个系统组
useradd -r yao 创建系统用户, 从999倒序
useradd -s /sbin/nologin yao 创建的是普通用户,从1000开始升序
useradd -d /opt/yao yao 创建用户时指定用户的家目录
useradd -u 3000 yao 创建用户并指定用户的uid
userdel yao 删除用户
userdel -r yao 删除用户并删除用户的家目录groupadd yaoshao 创建用户组
groupdel yaoshao 删除用户组模块参数:
group 组
groups 附加组
home 家目录
name 用户名
password 密码
remove 删除用户及家目录
shell 用户登录后使用的shell
system 创建一个系统用户
uid 用来指定用户的id
state 状态
使用
1 | ansible group -m user -a 'name=yao uid=4000 home=/opt/yao groups=root shell=/sbin/nologin' |
group
相关
模块参数:
gid 组的id
name 组名
system 系统组
state 状态
使用
1 | ansible group -m group -a 'name=yao system=yes' # 创建系统组 |
ansible 剧本
yaml
yaml
是一个编程语言,和XML
,ini
一样是用来写配置文件的语言
数据结构 :
字典: key: value
列表: [] -
后缀名 :
yaml
yml
ansible-playbook命令格式
执行顺序: 从上往下
特性: 幂等性 不管执行多少遍,结果都是一样的
参数:
-C, –check # 检查(白跑)
-f FORKS/ –forks=FORKS # 用来做并发
–list-hosts # 列出主机列表
–syntax-check # 语法检查
1 | ansible-playbook [options] playbook.yml [playbook2 ...] |
简单使用
1 | - hosts: group |
传参使用
方式一:
1 | # p2.yml的配置信息 |
方式二:
1 | # hosts中配置信息 |
方式三:
1 | # p2.yml的配置信息 |
方式四:
1 | # hosts中配置信息 |
方式五:
1 | - hosts: group |
传参方式的优先级:
1 | -e > playbook vars > hosts文件 |
setup
查看系统信息
1 | ansible_all_ipv4_addresses # ipv4的所有地址 |
条件判断
- 不同的系统
- 不同的版本
- 不同的环境
- 不同的用户
1 | - hosts: group |
tags
指定某个task
1 | - hosts: group |
1 | ansible-playbook -t path2 b.yml |
循环 with_item
1 | - hosts: group |
嵌套循环
1 | - hosts: group |
template
a.conf.j2表示使用jinja2模板
a.conf.j2:
1 | bind {{ ansible_default_ipv4.address }} |
1 | - hosts: group |
copy和tamplate的区别
- copy模块不替代参数
- template模块替代参数
handlers
handlers是另一种任务列表,你可以把handlers理解成另外一种tasks,你可以理解成它们是’平级’的,所以,handlers与tasks是’对齐’的(缩进相同),通过notify关键字’通知’handlers中的任务
1 | - hosts: group |
roles
为了避免代码重复,roles能够实现代码重复被调用
1 | # 创建目录 |
必须有main.yml文件,通过import_tasks来调用
files
:用来存放由copy模块或script模块调用的文件。templates
:用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。tasks
:此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。handlers
:此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。vars
:此目录应当包含一个main.yml文件,用于定义此角色用到的变量。defaults
:此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。meta
:此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。