ansible工具

关于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以:分开
- 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文件

猜你喜欢

转载自www.cnblogs.com/cuiyuanzhang/p/10408583.html