Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

ansible工具

崔园樟 2019-02-20 19:29:00 阅读数:189 评论数:0 点赞数:0 收藏数:0

关于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文件

版权声明
本文为[崔园樟]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/cuiyuanzhang/p/10408583.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;