关于ansible
在ansible官网上是这样介绍ansible的:Ansible is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates.
ansible是一块自动化IT工具,主要实现以下几个功能:
- 自动化部署
- 自动化管理配置
- 不停机更新
- 自动化持续交互
安装ansible
ansible默认使用SSH协议管理计算机,因为ansiible只需要安装在一台管控机上就可以以此为中心点管控多台服务器,不需要在其他机器上安装和运行软件,所以官网建议跟随ansible版本进行使用,现在ansible的最新版本是2.7版本,ansible能够在安装了python2.7x和3.x版本的计算机上运行,但是被管控的机器不包括windows,只支持一些类unix系统,如macOS,redhat,Debian,CentOS.本文就以CentOS来进行演示。
- 下载epel源
在https://opsx.alibaba.com/mirror 上直接复制就可以,不同的操作系统不一样,选择与自己系统相匹配的。 - 安装ansible
yum install -y ansible
这样ansible就安装好了,十分的方便不需要源码编译安装的步骤,
ansible都安装哪些东西?可以通过rpm -ql ansible
来查看。
补充一下yum源的配置。
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch #名字
baseurl=http://mirrors.aliyun.com/epel/7/$basearch #rpm源的地址,可以写http,https,ftp,Samba,file:
failovermethod=priority
enabled=1 # 是否开启,1代表开启,0表示关闭
gpgcheck=0 #是否校验签名,1代表校验,0表示校验
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
yum的包组安装
yum grouplist #查看包组信息
yum groupinstall #安装包组
机器之间怎么进行连接
上文说过,ansible默认通过SSH协议连接并控制被控节点,SSH有两种认证方式,密码和密钥,密钥的安全性更高故选择密钥。
ssh-keygen #生成SSH密钥对
ssh-copy-id 192.168.245.130 #复制密钥到远程主机
ansible的命令格式
ansible <host-parttern> [options]
-a MODULE_ARGS,--args=MOULE_ARGS #模块的参数
-C,--check #检查
-f FORKS,--forks=FORKS #用于做高并发
--list-hosts #列出主机列表
-m MODULE_NAME #模块名称
-k #输入密码
ansible的hosts文件
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character # 用#来表示注释
# - Blank lines are ignored # 空白行被忽略
# - Groups of hosts are delimited by [header] elements # 主机组 需要在【】下面
# - You can enter hostnames or ip addresses #可以写主机名或者ip地址
# - A hostname/ip can be a member of multiple groups # 一台主机可以在多个组里面
# www[001:006].example.com 表示从www001到www006的机器
配置举例,可以根据功能将机器进行分组。
[web]
192.168.13.25
192.168.22.231
[db]
192.168.23.33
192.168.13.25
host-pattern的格式
- 多个主机
全部主机 all - 多个的主机,中间用","隔开
- 单个组
- 多个组
- 交集 'web:&db'
- 并集'web,db' , 'web:db'
- 差集 'web:!db'
查看模块帮助信息
ansible-doc 参数 模块名
参数包括 -j, -l ,-s
-j #以json的方式返回ansible的所有模块
-l #列出所有的ansible模块
-s #片段式的显示
举例:
ansible-doc -s ping
ansible-doc -s command
ansible的模块
ping
Try to connect to host, verify a usable python and return `pong' on success.
ansible web -m ping #返回json pong
command
Executes a command on a remote node.
执行远程命令的模块,command不需要-m参数,因为-m参数是默认,不支持特殊字符,如管道符|等。
ansible web -a 'ls /'
ansible web -a 'chdir=/tmp pwd' #切换目录后执行命令
ansible web -a 'creates=/tmp pwd' #若/tmp目录存在,则不执行任何操作
ansible web -a 'removes=/tmp pwd' #若/tmp目录存在则执行操作
shell
Execute commands in nodes.
在远程主机执行远程主机的shell或python脚本及命令。
ansible web -m shell -a 'echo "123"|passwd --stdin cui' #鼻梁创建密码
ansible web -m shell -a'/tmp/a.sh' #执行a.sh文件
script
Runs a local script on a remote node after transferring it.
在远程主机执行本地的文件或脚本。
ansible web -m script -a '/root/a.sh' #在远程主机执行本地的文件
ansible web -m script -a 'removes=/root/m.sh /root/m.sh' # 如果存在,存在就执行
ansible web -m script -a 'creates=/root/a.sh /root/m.sh' #如果存在,就不执行
copy
Copies files to remote locations
参数:
- backup 备份,以时间戳结尾
- dest 目标地址
- src 文件源地址
- owner 文件的属主
- group 文件的属组
- mode 文件的权限 rwx
ansible web -m copy -a 'src=/tmp/a.sh dest=/tmp/a.sh' #复制本地文件到远程主机
ansible web -m copy -a 'src=/tmp/a.sh dest=/tmp/a.sh mode=755 owner=cui' #修改文件权限和属主
ansible web -m copy -a 'src=/tmp/a.sh dest=/tmp/' #复制文件,剥到远程主机,如果改变文件属性,文件夹内文件属性也会改变
ansible web -m copy -a 'src=/tmp/ dest=/tmp/' #复制目录内的所有文件到主机
ansible web -m copy -a 'content="我有点小帅" dest=/tmp/a.txt' #注入文本内容到远程文件
file
Sets attributes of files.
一些知识 点准备:
- inode获取的是硬盘的地址
- id获取的是内存地址
- ln -s a.txt b.txt 创建软连接
- ln a.txt b.txt 创建硬链接
- 若源文件发生改变,软连接和硬链接生成的文件都会随着变化
参数: - path 目标地址
- src 源地址
- state
- link 建立软连接
- file 建立文件
- directory 建立文件夹
- hard 建立硬链接
- touch 建立空文件
- absent 删除
ansible web -m file -a 'path=/tmp state=directory' #建立文件夹
ansible db -m file -a 'path=/tmp/a src=/etc/f' #建立软连接
fetch
Fetches a file from remote nodes
参数:
- src 源地址
- dest 目的地址
ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' #下载被控节点的文件,每台远程主机都会创建一个文件夹,保留原来的目录结构
yum
Manages packages with the `yum' package manager.
参数:
- disablerepo 禁用源
- enablerepo 启用源
- name 包名
- state
- install 安装
- remove 卸载
ansible web -m yum -a 'name=wget' # 安装wget
ansible web -m yum -a 'name=python2-pip' # 安装python2-pip
ansible web -m yum -a 'name=wget state=absent' # 卸载软件包
ansible web -m yum -a 'name="@Development Tools"' # 安装包组
pip
Manages Python library dependencies.
参数:
- chdir 切换目录后安装
- name 包名
ansible web -m pip -a 'name=flask' #安装flask
service
Manage services.
ss -tnlp 查看端口信息
参数:
- name 服务名
- enable 自启动
- state
- started 开始
- stoped 结束
- restarted 重启
- reload 平滑加载
ansible web -m service -a 'name=nginx state=started' # 启动nginx
ansible web -m service -a 'name=nginx state=stopped' # 关闭nginx
cron
Manage cron.d and crontab entries.
参数:
- day 天
- disable 禁用
- hour 小时
- job 任务
- minute 分钟
- month 月
- name 任务名字
- weekday 周
ansible db -m cron -a 'minute=26 job="touch /tmp/a.txt" name=touchfile' # 新建一个计划任务
ansible db -m cron -a 'name=touchfile state=absent' # 删除一个计划任务
ansible db -m cron -a 'minute=26 job="touch /tmp/ay.txt" name=touchfile disabled=yes' # 禁用计划任务,以#表示禁用
user
Manage user accounts.
参数:
- group 组
- groups 附加组
- home 家目录
- name 用户名
- password 密码
- remove 删除
- system 创建系统用户
- uid 指定用户的uid
- state
- absent
- shell 用户登陆后的shell
absible web -m user -a 'name=cyz uid=6666 home=/opt/cyz groups=root shell=/sbin/nologin' #创建用户cyz uid为666
absible web -m user -a 'name=cyz state=absent' #删除用户但不删除家目录
absible web -m user -a 'name=cyz state=absent remove=yes' #删除用户并删除家目录
group
Add or remove groups.
参数:
- gid 组id
- name 组名
- system 系统组
ansible -m group -a 'name=cui system=yes' #创建cui系统组
ansible -m group -a 'name=cui state=absent' #删除cui用户组
关于user和group的一些补充
用户:
- 管理员 root uid为0
- 普通用户
- 系统用户 不能登陆 uid为1-999(centos7)
- 登陆用户 可以登录 uid为1000-65535(centos7)
用户组:
- 管理员组 root 0
- 系统用户组 1-999
- 登陆用户组 1000-65535
useradd
- -r 创建系统用户
- -s 创建普通用户
- -d 创建用户时指定家目录
- -g 创建用户时指定用户组
- -G 创建用户时指定用户的执行组
- -u 创建用户时指定用户uid
userdel
- -r 删除用户并删除用户的家目录(默认只删除用户)
groupadd 创建用户组
- r 创建系统用户组
groupdel 删除用户组
关于计划任务的一些补充
crontab命令
- -e 编辑计划任务
- -l 查看计划任务
- -r 删除计划任务
计划任务的书写
* * * * * job
分 时 日 月 周 任务
0 */2 * * * job #每隔两个小时执行任务
0 12,13 * * * job # 12点和13点执行任务
0 12-17 * * * job #12-17点执行任务
0 12-17/2 * * * job #12-17点每隔两小时执行任务
关于pip的一些补充
pip install package #安装包
pip freeze >a.txt #导出环境
pip install -r a.txt #根据环境文件安装包
pip list #查看已经安装成功的包
ansible剧本(playbook)
剧本是ansible的配置和部署语言,它是由yaml编写的,用来描述对远程机器执行的策略或步骤。
yaml的语法
yaml是一种编写配置文件的编程语言,常见的配置文件后缀有.ini、.xml等,
由yaml编写的配置文件的后缀是.yaml 或.yml。
- 书写规范
- 不要使用tab,两个空格代表一个缩进
- ':'后要加一个空格
- '-' 后要加一个空格
- 变量使用{{}}表示
- 列表的所有元素均以'-'+空格开头
- 字典key和value以:分开
- 条件判断使用when
- 循环使用with_items,变量用{{item}}
- hosts: web
tasks:
- name: creategroup
group: name=cyz
- name: createuser
user: name=cui
变量的传参方式
- 通过命令行传递变量
ansible-playbook -e 'user=cui' a.yml
- 在hosts文件中声明,有两种方法。
[web]
192.168.13.25 user=cui
192.168.22.231 user=cyz
[web:vars]
user=cui
- 在剧本中声明
- hosts: db
vars:
- user: cui
tasks:
- name: create{{ user }}
user: name={{ user}}
- 使用register
- hosts: web
tasks:
- name: reg
shell: echo 'cui'
register: user
- name: createuser
user: name={{user.stdout}}
传参的优先级为:命令行>剧本>hosts文件