关于 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 或. YAML.
书写规范
不要使用 tab, 两个空格代表一个缩进
':'后要加一个空格
'-' 后要加一个空格
变量使用 {{}} 表示
列表的所有元素均以'-'+ 空格开头
字典 key 和 value 以: 分开
- - hosts: Web
- tasks:
- - name: creategroup
- group: name=cyz
- - name: createuser
- user: name=cui
变量的传参方式
通过命令行传递变量
ansible-playbook -e 'user=cui' a.YAML
在 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 文件
来源: http://www.bubuko.com/infodetail-2961986.html