一、ansible简介

运维工具种类众多,按其有无agent端可分为两类,agent类有puppet,func等,agentless类有ansible,fabric;agentless类无agent端,是基于ssh实现;可以说两类工具各有优缺点。 Ansible是一个强大的自动化运维管理工具,基于Python语言实现,由Jinja、Paramiko和PyYAML三个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等),ansible是模块化的,调用特定的模块以完成特定的任务,支持自定义模块;同时部署简单,可主从,支持playbook,具有幂等性。 ansible架构图

ansible各组件说明

  1. Ansible:核心程序
  2. Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以是静态的或者是使用Cobbler和AWS EC2的外部inventory脚本
  3. Playbooks:Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.如果 Ansible 模块你是工作室中的工具,那么 playbooks 就是你设置的方案计划.
  4. Custom Modules:自定义模块
  5. Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用核心模块,然后指明Host Inventory中的主机,就可以完成管理主机
  6. Connection Plugins:连接插件,Ansible和Host通信使用

二、ansible部署

1、ansible运行前提-公钥推送

		#ssh互免密:将管理端的公钥发送到所有被管理端
		ssh-keygen -t rsa
		ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.92.11
		ssh 192.168.92.11 ‘ifconfig’

2、安装ansible ansible已经被收录进epel源,直接yum安装即可

yum install ansible -y

三、主机清单inventory:hosts

inventory文件遵循INI文件风格。默认inventory文件:/etc/ansible/hosts;inventory文件可以有多个; 可以将同一种类型(同种操作)的主机放在同一主机组中,每台主机可以属于多个组,组名写在[]中,主机可以是域名,可以是IP,同时可用[]覆盖范围;可以在主机后加入端口,加入变量等等。 示例:

[server]
192.168.143.13[1:2]:22    
[node2]
k[a:c].example.com
[node3]
192.168.143.132 

Notes:未分组的主机应写在hosts文件顶部

四、配置文件:ansible.cfg

配置文件ansible.cfg定义了ansible的默认配置

[defaults] #通用默认段 #inventory = /etc/ansible/hosts #主机清单位置 #library = /usr/share/ansible #ansible默认搜寻模块的位置 #remote_tmp= $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录 #local_tmp= $HOME/.ansible/tmp #ansible管理节点的执行路径 #forks = 5 #默认并发数 #poll_interval= 15 #轮询间隔 #sudo_user= root #sudo使用的默认用户,默认是root #ask_sudo_pass= True #是否需要用户输入sudo密码,默认是False #ask_pass= True #这个可以控制,Ansible 剧本playbook 是否会自动默认弹出弹出密码.默认为False #remote_port= 22 #远程主机端口号,默认是22 #module_lang= C #这是默认模块和系统之间通信的计算机语言,默认为'C'语言. #host_key_checking= True #跳过ssh首次连接提示验证部分,默认是True,建议取消注释 #timeout = 10 #连接超时时间 #module_name= command #指定ansible默认的执行模块 #nocolor= 1 #默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息.如果你想关闭这一功能,可以把'nocolor'设置为'1': #private_key_file=/path/to/file.pem #在使用ssh公钥私钥登录系统时候,使用的密钥路径。 #deprecation_warnings = True #允许在ansible-playbook输出结果中禁用“不建议使用”警告 #log_path=/var/log/ansible.log #日志文件

可参考文档:http://www.ansible.com.cn/docs/intro_configuration.html#getting-the-latest-configuration

五、ansible 系列命令

Ansible

ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端基于秘钥认证的方式连接被管理节点

ansible <host-pattern> [options]
Options“
	--version:显示版本
	-m module :指定模块,默认为command
	-v,--verbose:详细模式(-vvv了解更多,-vvvv启用连接调试)
	--list-host:显示主机列表
	-k,--ask-pass:提示输入ssh连接密码,默认key验证
	-K,--ask-become-pass:提示输入sudo时的口令
	-C,--check:检查,但不执行
	-T,--timeout=TIMEOUT:执行命令的超时时间,默认是10秒
	-u,--user:远程执行的用户,默认是当前ansible主机的用户
	-b,--become:代替旧版的sudo切换
Host-pattern:匹配的主机列表
	all:表示所有Inventory中的所有主机
		Ansible all -m ping
	*:通配符
		Ansible "*" -m ping
		Ansible "192.168.143.*" -m ping
		Ansible "*server" -m ping
	或关系
		Ansible "node1:node2" -m ping
		Ansible "192.168.143.10:192.168.143.11" -m ping
	逻辑与:在node1组并且在node2中的主机
		Ansible "node1:&node2" -m ping
	逻辑非:在node1组,但不在node2组中的主机,必须用单引号
		Ansible 'node1:!node2' -m ping
	综合逻辑
		Ansible 'node1:node2:&node3:!node4' -m ping
	正则表达式
		Ansible "~node(1|2)" -m ping

Ansible命令的执行过程 1、加载配置文件ansible.cfg 2、加载对应模块 3、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-DIGIT/XXX.py文件 4、给文件加执行权限 5、执行并返回结果 6、删除临时py文件,sleep 0退出

执行状态: - 绿色:执行成功并不做更改 - 黄色:执行成功,对目标主机作出更改 - 红色:执行失败

Ansible-doc

显示模块帮助

ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
Options:
	-l,--list:列出可用模块
	-s,--snippet:显示指定模块的playbook片段
	-F,--list_files:显示插件名称及其源文件,不带摘要(隐含--list)
	-M MODULE_PATH,--module-path = MODULE_PATH :将冒号分隔的路径添加到模块库
	-t TYPE,--type = TYPE:选择哪种插件类型(默认为“模块”)
	-v,--verbose:详细模式(-vvv了解更多,-vvvv启用连接调试)
	-h,--help:帮助信息

Ansible-galaxy 连接https://galaxy.ansible.com下载对应的roles

示例:

	列出所有已安装的galaxy
	ansible-galaxy list 
	
	安装galaxy
	ansible-galaxy install geerlingguy.redis
	
	删除galaxy
	ansible-galaxy remove geerlingguy.redis

Ansible-pull

推送命令至远程,效率无限提升,对运维要求较高

Ansible-vault

管理加密解密yml文件

ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 编辑加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create hello.yml 创建新文件

Ansible-console

ansible-console是2.0以后的版本新增的,可交互执行命令,支持tab补全 root@all (2)[f:5]$ :执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$ 设置并发数:forks 10 切换组:cd 主机组 列出当前组主机列表:list 列出所有的内置命令:?或help

Ansible-config

查看ansible的配置 ansible-config [dump|list|view] [--help] [options] [ansible.cfg] Options: -c CONFIG_FILE,--config = CONFIG_FILE:配置文件路径

Ansible-inventory

ansible-inventory [options] [host|group] Options: --list:输出所有主机信息 --host=HOST:输出指定主机的信息 --graph:树状图显示所有主机

六、ansible常用模块

1、ping

测试主机连通性,回复pong表示成功

ansible all -m ping

2、user与group

创建用户与组,创建用户需在设置密码 常用参数: home:指定用户的家目录,需要与createhome配合使用。 groups:指定用户的属组。 uid:指定uid。 gid:指定gid password:指定用户的密码。 name:指定用户名。 createhome:是否创建家目录 yes|no。 system:是否为系统用户。 remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。 state:是创建还是删除。(present,absent) shell:指定用户的shell环境。 generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。 ssh_key_bits:可选择指定要创建的SSH密钥中的位数。 ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。 ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。 ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。 例1:创建redhat用户 ansible all -m user -a 'name=redhat state=present' 例2:为创建的用户设置密码 ansible all -m shell -a 'echo redhat|passwd --stdin redhat' 例2:删除用户 ansible all -m user -a 'name=redhat state=absent'

3、cron

创建删除修改计划任务(使用name识别计划任务) 常用参数: minute:指定计划任务中的分钟 hour:指定计划任务中的小时 day:指定计划任务中的天 month:指定计划任务中的月 weekday:指定计划任务中的周 special_time:计划任务的时间设定格式为 @reboot 或者@hourly。@reboot 表示重启时执行,@hourly 表示每小时执行一次,相当于设置成”0 0 * * ” ,这种@开头的时间设定格式则需要使用 special_time 参数进行设置,special_time 参数的可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时),在未设置时间单位时special_time默认每秒执行,所以使用此参数需要设置好时间单位 user:指定当前计划任务属于哪个用户 job:指定计划任务需要执行的命令 name:指定计划任务的名称,名称具有唯一性,创建删除修改操作都依靠名称来唯一标识 state:再根据名称删除计划任务时,将state的值设置为absent disabled:根据名称关闭计划任务,需要指定任务的名称(name),时间(hour…)以及命令(job) backup:如果设置此参数为yes时,那么当修改或删除对应计划任务时,会先备份在执行相应操作,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes。 例1:每隔10分钟更新下时间 ansible all -m cron -a 'name="sync time for ntpserver" minute="/10" job="/sbin/ntpdata 192.168.0.1 &> /dev/null"' 例2:删除任务 ansible all -m cron -a 'name="sync time for ntpserver" state=absent'

4、copy

文件复制或文件推送模块 常用参数: src:被复制到远程主机的本地对象文件或者文件夹,可以是绝对路径,也可以是相对路径。 dest:被复制到远程主机的本地对象文件或者文件夹 mode:复制对象的设定权限 backup:在文件存在的时候可以选择覆盖之前,将源文件备份.设定值:yes/no 缺省为yes force:是否强制覆盖.设定值:yes/no 缺省为no owner:修改被复制到远程主机的本地对象文件或者文件夹的属主 group:修改被复制到远程主机的本地对象文件或者文件夹的属组 例1:复制文件到远程主机 ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.tmp mode=600'

5、file

设置文件属性 常用参数: path:必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以 src:当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。 force:当state设置为link,force设置为yes时,表示强制创建链接文件;有三种情况分别是: 情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。 owner:指定被操作文件的属主,属主必须存在,否则报错 group:指定被操作文件的属组,属组必须存在,否则报错 mode:设定被操作文件的权限 recurse:操作目录时,recurse设置为yes,可以递归目录中文件的属性 state:state设置为directory时,与path结合就可以操作目录,state设置为touch时,可以操作文件,state设置为link时,可以创建软连接,将state创建为hard时,可以创建硬链接,将state创建为absent时,删除目标。 例1:创建目录 ansible all -m file -a 'path=/tmp/testdir state=directory' 例2:创建文件 ansible all -m file -a 'path=/tmp/testfile state=touch mode=600' 例3:创建软链 ansible all -m file -a 'path=/tmp/testlink state=link src=/etc/fstab'

6、service

管理远程主机的服务,想要管理远程主机中的某个服务,那么这个服务必须能被 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart 中的任意一种所管理,否则 service 模块也无法管理远程主机的对应服务。 常用参数: name:指定需要管理的服务 state:state的值有started、stopped、restarted、reloaded,用于指定服务的状态 enabled:指定是否将服务开机启动 例1:开启httpd服务并开机启动 ansible all -m service -a 'name=httpd state=started enabled=yes' 例2:关闭httpd服务并取消开机启动 ansible all -m service -a 'name=httpd state=stopped enabled=no'

7、yum

管理红帽系列远程主机的程序包,前提是远程主机配置好yum源 常用参数: conf_file:设定远程yum执行时所依赖的yum配置文件 disable_gpg_check:在安装包前检查包,只会影响state参数为present或者latest的时候 disablerepo:不启用某个源 enablerepo:启用某个源 name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径 state:state的值有present,installed,removed,absent,latest,默认是present或installed,都表示安装;absent和removed表示卸载,latest表示安装最新版本 例1:安装nginx ansible all -m yum -a 'name=nginx state=latest'

8、shell

在被管理主机上执行命令,与command不同的是,shell在远程主机执行命令时,会用远程主机的/bin/bash来处理 常用参数: free_from:指定需要在远程主机上执行的命令 chdir:指定一个目录,在执行命令时,先cd到chdir指定的目录 creates:当指定的文件存在时,不执行命令 removes:指定的文件不存在时,跳过执行命令步骤 warn:如果执行的命令报错,warn值为false时,忽略报错信息 executable:更改用于执行命令的shell,,默认为bash,要修改必须指定绝对路径 例1:为创建的用户设置密码 ansible all -m shell -a 'echo redhat|passwd --stdin redhat'

Note:在执行复杂的命令时,command与shell都会有些问题,最好将要做的操作写个脚本,在远程服务器执行之后取结果

9、script

将本地脚本传输到远程节点后运行 常用参数: free_from:指定需要在远程主机上执行的命令 chdir:指定一个目录,在执行命令时,先cd到chdir指定的目录 creates:当指定的文件存在时,不执行命令 removes:指定的文件不存在时,跳过执行命令步骤 executable:更改用于执行命令的shell,,默认为bash,要修改必须指定绝对路径 例1:执行脚本 ansible all -m script -a '/root/test.sh'

10、setup

从远程主机收集facts 每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本,IP地址等报告给远程的ansible主机 ansible all -m setup 获取到的常用数据: ansible_all_ipv4_addresses:仅显示ipv4的信息 ansible_devices:仅显示磁盘设备信息 ansible_distribution:显示是什么系统,例:centos,suse等 ansible_distribution_major_version:显示是系统主版本 ansible_distribution_version:仅显示系统版本 ansible_machine:显示系统类型,例:32位,还是64位 ansible_eth0:仅显示eth0的信息 ansible_hostname:仅显示主机名 ansible_kernel:仅显示内核版本 ansible_lvm:显示lvm相关信息 ansible_memtotal_mb:显示系统总内存 ansible_memfree_mb:显示可用系统内存 ansible_memory_mb:详细显示内存情况 ansible_swaptotal_mb:显示总的swap内存 ansible_swapfree_mb:显示swap内存的可用内存 ansible_mounts:显示系统磁盘挂载情况 ansible_processor:显示cpu个数(具体显示每个cpu的型号) ansible_processor_vcpus:显示cpu个数(只显示总的个数) ansible_python_version:显示python版本

11、command

命令模块,默认模块,用于在远程执行命令 command不支持变量,<> | ; &等,用shell模块实现 例1:取时间 ansible all -a 'data'

12、fetch

从客户端取文件至服务器端,与copy相反,取目录时先tar再取 例1: ansible node2 -m fetch -a "src=/etc/fstab dest=/root/data"

13、hostname

管理主机名 例1: ansible node2 -m hostname -a "name=node2.example.com"

14、systemd

Rhel7使用systemd管理各服务 常用参数: name:服务名 state:需要的操作,reloaded, restarted, started, stopped enabled:是否需要开机启动 daemon_reload:systemd 读取配置文件,每次修改了文件,最好都运行一次

参考:马哥ansible学习视频