一、ansible简介
运维工具种类众多,按其有无agent端可分为两类,agent类有puppet,func等,agentless类有ansible,fabric;agentless类无agent端,是基于ssh实现;可以说两类工具各有优缺点。 Ansible是一个强大的自动化运维管理工具,基于Python语言实现,由Jinja、Paramiko和PyYAML三个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等),ansible是模块化的,调用特定的模块以完成特定的任务,支持自定义模块;同时部署简单,可主从,支持playbook,具有幂等性。 ansible架构图
ansible各组件说明
- Ansible:核心程序
- Host Inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以是静态的或者是使用Cobbler和AWS EC2的外部inventory脚本
- Playbooks:Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.如果 Ansible 模块你是工作室中的工具,那么 playbooks 就是你设置的方案计划.
- Custom Modules:自定义模块
- Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用核心模块,然后指明Host Inventory中的主机,就可以完成管理主机
- 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学习视频