Ansible自动化运维,ansible命令基础,Ansible常用模块,ansible安装

ansible是2013年推出的一款IT自动化和DevOps软件,2015年被RedHat收购。是基于Python研发,糅合很多老运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能

ansible可以实现

自动化部署APP
自动化管理配置项
自动化持续交付
自动化(AWS)云服务管理

具备 Linux 服务器 (server) 基础操作和管理经验。
会使用 ssh 远端连线至 server。
知道基本的标准输入 (stdin) 输出 (stdout) 等观念。
会安装 Linux 套件。
知道 sudo 指令在做什么,并且会使用它。
知道什么是档案权限,并且会修改它。
知道如何启用和停止系统服务 (Daemon / Service)。
会撰写简易的脚本 (Script)。

  • ansible特性
    模块化设计,调用特定的模块完成特定任务
    基于Python语言实现
    paramiko
    PyYAML (半结构化语言)
    Jinja2
    • 其模块支持JSON等标准输出格式,可以采用任何编
    程语言重写

ansible安装

  • 软件依赖关系
    对于被托管主机
    ansible默认通过SSH协议管理机器
    被管理主机要开启ssh服务,允许ansible主机登录
    在托管节点上也需要安装Python2.5或以上的版本
    如果托管节点上开启了SElinux,需要安装libselinux-python
    • 对管理主机
    – 要求Python 2.6 或Python 2.7
    • ansible 使用以下模块,都需要安装
    paramiko   PyYAML   Jinja2   httplib2   six

自定义yum仓库更新索引文件
createrepo --update .

安装及验证
在 ansible 托管主机上配置 yum 配置文件
安装 yum install ansible
验证 ansible --version

CentOS 安装
新增 epel-release 第三方套件来源。
sudo yum install -y epel-release
安装 Ansible。
sudo yum install -y ansible

ansible配置文件查找顺序

首先检测ANSIBLE_CONFIG变量定义的配置文件
其次检查当前目录下的 ./ansible.cfg 文件
再次检查当前用户家目录下 ~/ansible.cfg 文件
最后检查/etc/ansible/ansible.cfg文件
/etc/ansible/ansible.cfg是ansible的默认配置文件路径

主机定义与分组

[root@ansible /]# ls /etc/ansible
ansible.cfg  hosts  

ansible.cfg 配置文件
inventory 定义托管主机地址配置文件路径名

[root@ansible /]# vim /etc/ansible/ansible.cfg
    inventory      = /etc/ansible/hosts

ansible.cfg 配置文件
ssh 主机 key 验证配置参数

[root@ansible /]# vim /etc/ansible/ansible.cfg
host_key_checking = False

如果为 False,不需要输入 yes
如果为 True,等待输入 yes

inventory 指定的配置文件,写入远程主机的地址。
配置主机文件
格式:
#表示注释
[组名称]
主机名称或ip地址,其他参数

[root@ansible /]# vim /etc/ansible/hosts

[web]         #web组名称,下面2台web主机
web [1 : 2]       #1:2为web1到web2两台主机,1:20为web1到web20多台主机
[db]      #数据库组,下面2台数据库主机
db1   ansible_ssh_port=222      #db1可以写成主机名称或ip地址,ansible_ssh_port=222表示ansible用ssh服务连接的时候是用222端口,定义这台机器的单独变量
db2
[other]
cache

inventory 扩展参数

  • inventory 参数说明

ansible_ssh_port
ssh端口号:如果不是默认的端口号,通过此变量设置

 [db]          #数据库组,下面1台数据库主机
 db1     ansible_ssh_port=222      #db1可以写成主机名称或ip地址,ansible_ssh_port=222表示ansible用ssh服务连接的时候是用222端口

ansible_ssh_user
默认的ssh用户名

[db]          #数据库组,下面1台数据库主机
db1          ansible_ssh_user="root"

ansible_ssh_pass
默认的ssh用户名密码 (这种方式并不安全,强烈建议使用–ask-pass
或SSH密钥)
ansible_ssh_pass=“a”

ansible_ssh_private_key_file
ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况

[all:vars]     
ansible_ssh_user="root"
ansible_ssh_pass="a"
ansible_ssh_private_key_file="/root/.ssh/id_rsa.ansible"  #这个路径要写对应的秘钥文件,ssh服务生成秘钥的文件路径在/root/.ssh/id_rsa

[all:vars]        #all表示所有组,也可以定义一个组或一台主机,下面表示这些组配置统一的变量
ansible_ssh_private_key_file="/root/.ssh/key"

children 子组定义,用于引用其他组名称
[app:children] #app定义的话就是ansible不识别是主机还是组,加上children,定义子组,单独把这些组加入到这个子组里
web
db

自定义配置文件
创建文件夹myansible   #这个名字可以随便取
创建配置文件ansible.cfg
[defaults]       #这个固定格式
inventory = /var/myansible/myhost     #这个名字,路径可以随便取但是要创建和配置
host_key_checking = False

inventory指定的自定义配置主机文件
[root@ansible /]# vim /var/myansible/myhost
[app1] #自定义分组
web1
db1

  • 动态主机
    无限可能
    ansible Inventory包含静态和动态的Inventory,静态Inventory指在文件/etc/ansible/hosts中指的主机和组,动态Inventory指通过外部脚本获取主机列表,按照其要求格式返回给ansilbe命令
    Json
    JSON(JavaScript Object Notation,JavaScript对象表示法),一种基于文本独立于语言的轻量级数据交换格式

ansible命令基础

• ansible 主机集合 -m 模块名称 -a 模块参数
主机集合 主机名或分组名,多个使用"逗号"分隔
-m 模块名称,默认 command 模块
-a
or --args 模块参数
• 其他参数
-i inventory文件路径,或可执行脚本
-k 使用交互式登录密码
-e 定义变量
-v 显示详细信息

命令格式: ansible  组名或主机名  -m    [ 调用模块名]   -a    [模块命令]
  • 列出要执行的主机
    ansible all --list-hosts

  • 调用ping模块批量检测主机

  • ansible all -m ping -k

    [root@ansible /]# ansible all -m ping -k
    SSH password:     #出现交互,要求输入密码

部署证书文件

ansible 是通过 SSH 在远程执行命令的
ssh 远程执行命令必须要通过认证才行
• 密码写入配置文件安全性很差
• 使用key方式认证
• 给所有主机部署公钥
没有秘钥命令执行会出错
ansible web -a ‘uptime’

创建一对密钥

ssh-keygen -t rsa -b 2048 -N '' -f key

给所有主机部署密钥

ssh-copy-id -i key.pub 主机名称

Ansible常用模块

ansible-doc和ping模块
• ansible-doc
模块的手册相当与shell的man,很重要
ansible-doc -l       #列出所有模块
ansible-doc modulename       #查看帮助
• ping 模块
测试网络连通性, ping模块没有参数
注:测试ssh的连通性
ansible [组名|主机集合] -m ping

command模块
默认模块,远程执行命令
格式: ansible [组名|主机名] -m [模块名] -a ‘[args]’
查看所有机器负载
ansible all -m command -a ‘uptime’
查看日期和时间
ansible all -m command -a ‘date +%F_%T’

command模块注意事项:
该模块通过-a跟上要执行的命令可以直接执行,若命令里有如下字符则执行不成功 “<” , “>” , “|” , “&”
command 模块不能解析系统变量
该模块不启动shell直接在ssh进程中执行,所有使用到
shell的命令执行都会失败

下列命令执行会失败
ansible all -m command -a ‘ps aux|grep ssh’
ansible all -m command -a ‘set’

shell模块
shell 模块用法基本和command一样,区别是shell模块是通过/bin/sh进行执行命令,可以执行任意命令,不能执行交互式的命令,例如 vim top 等
查看所有机器的负载
ansible all -m shell -a ‘uptime’

ansible web -m shell -a “echo ${HOSTNAME}” #在当前终端解析
ansible web -m shell -a ‘echo ${HOSTNAME}’ #在连接后执行机器上解析

  • 变量解析
    ansible 执行命令是二次解析,第一次在本机解析, 第二次在执行机器解析需要第二次解析的变-量要转移()

    ansible cache -m shell -a ‘cd /tmp’ #连接主机后切换目录
    ansible cache -m shell -a ‘touch testfile’ #连接主机后切换脚本

ansible 是使用 ssh 多次连接执行,连接退出以后之前的状态就全部失效了
解决方法:使用 chdir 代替 cd 命令
ansible cache -m shell -a 'chdir=/tmp touch testfile

script模块
• script模块
在本地写脚本,然后使用script模块批量执行
ansible t1 -m script -a ‘脚本名称’

注意:该脚本包含但不限于shell脚本,只要指定Sha-bang解释器的脚本都可运行

yum模块
使用yum包管理器来管理软件包
name:要进行操作的软件包名字
state: 动作(installed, removed)
install
=== installed
remove === removed
格式: ansible [组名|主机名] -m yum -a ‘name="软件名称"state=动作(安装|删除)’

给所有db 主机安装 mariadb

ansible db -m yum -a 'name="mariadb-server"state=installed'

cache 主机删除lrzsz

ansible cache -m yum -a 'name="lrzsz" state=removed'

service模块
name:必选项,服务名称
enabled:是否开机启动 yes|no
sleep:执行restarted,会在stop和start之间沉睡几秒钟
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
格式: ansible [组名|主机名] -m service(模块名) -a 'name=软件名称 enabled(开机启动)=yes|no(开|关) state(状态)=“启动,停止、重启、重新加载”

ansible all -m service -a ‘name=sshd enabled=yes state=started’

copy模块
复制文件到远程主机
src:复制本地文件到远程主机,绝对路径和相对路径都可,路径为目录时会递归复制。若路径以"/“结尾,只复制目录里的内容,若不以”/"结尾,则复制包含目录在内的整个内容,类似于rsync
dest:必选项。远程主机的绝对路径,如果源文件是一个目录,那该路径必须是目录
backup:覆盖前先备份原文件,备份文件包含时间信息。有两个选项:yes|no
force:若目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,设为no,则只有当目标主机的目标位置不存在该文件时才复制。默认为yes
格式:ansible [组名|主机名] -m [模块名] -a ‘源参数路径 目标参数路径’
复制文件
ansible all -m copy -a ‘src=/etc/resolv.conf
dest=/etc/resolv.conf’
复制目录
ansible all -m copy -a ‘src=/etc/yum.repos.d/
dest=/etc/yum.repos.d/’

lineinfile 模块 (匹配行级修改)
类似sed的一种行编辑替换模块
path 目标文件文件
regexp 正则表达式,要修改的行
line 最终修改的结果
格式:ansible [组名|主机名] -m [模块名] -a ‘path=目标文件文件 regexp=正则表达式,要修改的行 line=最终修改的结果’

例如修改 my.cnf,中 bin-log 的格式 mixed --> row
ansible db -m lineinfile -a 'path="/etc/my.cnf"regexp="^binlog-format" line=“binlog-format = row” ’

replace模块 (匹配字符级修改,更精准匹配)
类似sed的一种行编辑替换模块
path 目的文件
regexp 正则表达式
replace 替换后的结果

格式: ansible [组名|主机名] -m [模块名] -a ‘path=目标文件文件 regexp=正则表达式,要修改字符 replace =替换后的结果’

替换指定字符 row --> mixed
ansible db -m replace -a 'path="/etc/my.cnf"regexp="row"replace=“mixed” ’

setup模块
主要用于获取主机信息,playbooks里经常会用的另一个参数gather_facts与该模块相关,setup模块下经常
用的是filter参数
filter过滤所需信息
ansible cache -m setup -a ‘filter=ansible_distribution’
也可以这样使用 ansible cache -m setup 用于收集目标主机信息
格式:ansible [组名|主机名] -m [模块名] -a ‘filter=ansible_匹配条件’

file模块
设置文件的属性
相关选项如下:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况

state选项:

directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件

格式:ansible [组名|主机名] -m [模块名] -a ‘src=被链接的源文件路径 dest=被链接到的路径 state=选项’
远程文件符号链接创建
ansible storm_cluster -m file -a “src=/etc/resolv.conf dest=/tmp/resolv.conf state=link”
远程文件符号链接删除
ansible storm_cluster -m file -a “path=/tmp/resolv.conf state=absent”
远程文件信息查看
ansible storm_cluster -m command -a “ls -al /tmp/resolv.conf”

更多模块

service:系统服务管理
cron:计划任务管理
synchronize:使用rsync同步文件
user:系统用户管理
group:系统用户组管理

更多模块可以参考:ansible-doc –l

一些概念补充

playbook的组成:playbook是由一个或多个“play”组成的列表,可以让它们联同起来按事先编排的机制执行;所谓task无非是调用ansible的一个module,而在模块参数中可以使用变量;模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致;

执行模型:task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在顺序运行某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在修改playbook后重新执行一次即可;

task组成:每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出;

notify指定handler的执行机制:“notify”这个action可用于在每个play的最后被触发,在notify中列出的操作称为handler,仅在所有的变化发生完成后一次性地执行指定操作。

一些学习资料:

http://blog.xiaorui.cc/category/ansible/

http://lixcto.blog.51cto.com/4834175/d-4

https://github.com/ansible/ansible-examples

http://rfyiamcool.blog.51cto.com/1030776/d-51

http://dl528888.blog.51cto.com/2382721/d-4/p-1

http://edu.51cto.com/course/course_id-2220.html

http://edu.51cto.com/course/course_id-2032.html

http://www.shencan.net/index.php/category/自动化运维/ansible/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值