Ansible学习
一、Ansible概述
1.什么是ansible?
Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,
可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
2.自动化工具
1.puppet 学习难,安装ruby环境难,没有远程执行功能 2.ansible 轻量级(只部署管理机即可),大规模环境下只通过ssh会狠慢,串行的 3.saltstack 一般选择salt会使用C/S结构的模式,salt-master和salt-minion,并行的,大规模批量操作的情况下(服务器超过200台),
会比Ansible速度快一些,底层使用的是zero-MQ消协队列 (也可以使用ssh方式) # ansible和saltstack语法和接近 # saltstack支持python3,ansible支持python2
3.自动化运维相较于手动运维
1.提高工作效率 2.提高工作的准确度 3. 减少人员成本 4.减少重复的工作量
4.Ansible功能及优点
1.远程执行 批量执行远程命令,可以对多台机器远程操作 2.配置管理 批量配置软件,可以自动分发配置文件,服务统一管理启动或停止 3.事件驱动 通过Ansible的模块,对服务进行不同的事件驱动 比如: 1)修改配置后重启 2)只修改配置文件,不重启 3)修改配置文件后,重新加载 4)远程启停服务管理 4.管理公有云 通过API接口的方式管理公有云,不过这方面做的不如saltstack saltstack本身可以通过saltcloud管理各大云厂商的云平台。 5.二次开发 因为语法是Python,所以便于运维进行二次开发。 6.任务编排 可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套框架的部署 7.跨平台,跨系统 几乎不受到平台和系统的限制,比如安装apache和启动服务
二、Ansible架构
1、连接插件connection plugins用于连接主机 用来连接被管理端 2、核心模块core modules连接主机实现操作,它依赖于具体的模块来做具体的事情 3、自定义模块custom modules根据自己的需求编写具体的模块 4、插件plugins完成模块功能的补充 5、剧本playbook ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行 6、主机清单inventor定义ansible需要操作主机的范围 最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
1.Ansible执行流程
1.Ansible读取playbook剧本,剧本中会记录哪些主机执行哪些任务。 2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。 3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表 4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。
三、安装Ansible
1.环境装备
主机名 | 内网ip | 外网ip | 身份 |
---|---|---|---|
m01 | 172.16.1.61 | 10.0.0.61 | Ansible控制端 |
web01 | 172.16.1.7 | 10.0.0.7 | Ansible受控端 |
web02 | 172.16.1.8 | 10.0.0.8 | Ansible受控端 |
lb01 | 172.16.1.4 | 10.0.0.4 | Ansible受控端 |
lb02 | 172.16.1.5 | 10.0.0.5 | Ansible受控端 |
2.安装ansible
[root@m01 ~]# yum install -y ansible
3.ansible参数
[root@m01 ~]# ansible --version ansible 2.9.27 config file = /etc/ansible/ansible.cfg #配置文件 configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] # 模块目录 ansible python module location = /usr/lib/python2.7/site-packages/ansible #python模块安装目录 executable location = /usr/bin/ansible #ansible命令 python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]#python版本 # ansible <host-pattern> [options] --version #ansible版本信息 -v #显示详细信息 -i #主机清单文件路径,默认是在/etc/ansible/hosts (一般用临时的,除非清单临时使用一次) -m #使用的模块名称,默认使用command模块 -a #使用的模块参数,模块的具体动作 -k #提示输入ssh密码,而不使用基于ssh的秘钥认证 -C #模拟执行测试,但不会真的执行(没用) -T #执行命令的超时 #注: 一般就用 -m和-a即可
4.ansible配置文件
[root@m01 ~]# vim /etc/ansible/ansible.cfg # nearly all parameters can be overridden in ansible-playbook # or with command line flags. ansible will read ANSIBLE_CONFIG, # ansible.cfg in the current working directory, .ansible.cfg in # the home directory or /etc/ansible/ansible.cfg, whichever it # finds first #配置文件读取优先级查找如下 [root@m01 ~]# rpm -ql ansible #找ansible-config.1.gz文件 [root@m01 ~]# zcat /usr/share/man/man1/ansible-config.1.gz #查找优先级顺序 #要查看完整列表,请访问https://docs.ansible.com/或使用ansible-config命令。 For a full list check \fI\%https://docs.ansible.com/\fP\&. or use the \fIansible\-config\fP command. #/etc/ansible/ansible.cfg 配置文件,如果存在则使用 /etc/ansible/ansible.cfg \-\- Config file, used if present #~/.ansible.cfg 用户配置文件,覆盖默认配置(如果存在) ~/.ansible.cfg \-\- User config file, overrides the default config if present #\&./ansible.cfg 本地配置文件(在当前工作目录中)假定为(aqproject specific) (aq,如果存在,则重写其余文件)。 \&./ansible.cfg \-\- Local config file (in current working directory) assumed to be \(aqproject specific\(aq and overrides the rest if present. #如上所述,ANSIBLE_CONFIG环境变量将覆盖所有其他环境变量。 As mentioned above, the ANSIBLE_CONFIG environment variable will override all others. Ansible配置文件读取顺序 1. $ANSIBLE_CONFIG 环境变量 2. ./ansible.cfg 当前目录下的 3. ~/.ansible.cfg 家目录下的 4. /etc/ansible/ansible.cfg (正常情况只使用该配置文件)
5.ansible配置文件
[root@m01 ~]# cat /etc/ansible/ansible.cfg #inventory = /etc/ansible/hosts #主机清单配置文件 #library = /usr/share/my_modules/ #库文件存放目录 #remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录 #local_tmp = ~/.ansible/tmp #主机的临时执行目录 #forks = 5 #默认并发数(一般不改,不要设置太大,实际上串行就行了) #sudo_user = root #默认sudo用户(ansible执行的用户,一般使用root用户) #ask_sudo_pass = True #每次执行是否询问sudo的ssh密码 #ask_pass = True #每次执行是否询问ssh密码 #remote_port = 22 #远程主机端口(默认22,因为每台端口可能不同,在主机清单里配) host_key_checking = False #跳过检查主机指纹(一定要打开!ssh连接就不用输入yes,否则卡在输yes上) log_path = /var/log/ansible.log #ansible日志(无所谓配不配,运行时报错会直接展示) #普通用户提权操作(我们用的是root账户,这个一般也用不上) [privilege_escalation] #become=True #是不是开启 #become_method=sudo #提权的命令 #become_user=root #提权的用户 #become_ask_pass=False #要不要认证密码 总结:一般配置文件只要打开下面一个注释即可 [root@m01 ~]# vim /etc/ansible/ansible.cfg host_key_checking = False # 打开注释
四、主机清单配置
1.单主机配置
[root@m01 ~]# vim /etc/ansible/hosts #方式一:IP + 端口 + 用户 + 密码 (端口默认22,用户默认root,ansible_ssh_port和ansible_ssh_usr可以不写) [web01] 10.0.0.7 ansible_ssh_port=22 ansible_ssh_usr=root ansible_ssh_pass='admin123' [web02] 10.0.0.8 ansible_ssh_port=22 ansible_ssh_usr=root ansible_ssh_pass='admin123' #注:ansible配置完后不需要重启 #方式二:主机名 + 密码 (必须将主机名写入hosts) [root@m01 ~]# vim /etc/hosts #本机配置主机名host 172.16.1.7 web01 172.16.1.8 web02 [root@m01 ~]# vim /etc/ansible/hosts [web1] #这里web1和web01不能一致,否则告警组名和主机名不能一致 web01 ansible_ssh_pass='admin123' [web2] web02 ansible_ssh_pass='admin123' #方式三:主机名 + 变量密码 (必须将主机名写入hosts) (很鸡肋,没什么用) [root@m01 ~]# vim /etc/hosts #本机配置主机名host 172.16.1.7 web01 172.16.1.8 web02 [root@m01 ~]# vim /etc/ansible/hosts [web1] #这里web001和web01不能一致,否则告警组名和主机名不能一致 web01 [web1:vars] ansible_ssh_pass='admin123'
2.基于秘钥连接
1)生成密钥对
#1.生成密钥对 [root@m01 ~]# ssh-keygen #2.推送公钥 [root@m01 ~]# ssh-copy-id [email protected] [root@m01 ~]# ssh-copy-id [email protected]
2)配置主机清单
[root@m01 ~]# vim /etc/ansible/hosts #方式一:主机ip + 秘钥 [web001] 10.0.0.7 [web002] 10.0.0.8 #方式二:主机名 + 秘钥 (必须将主机名写入hosts) [web1] web01 [web2] web02
3.主机组配置清单
[root@m01 ~]# vim /etc/ansible/hosts [web_group] web01 web02 [lb_group] 172.16.1.4 ansible_ssh_pass='admin123' 172.16.1.5 ansible_ssh_pass='admin123' #测试 [root@m01 ~]# ansible 'web_group' -m ping #查看指定组的主机 [root@m01 ~]# ansible web_group --list-host hosts (2): web01 web02 [root@m01 ~]# ansible all --list-host #all为内置变量,表示配在主机清单里的所有主机 hosts (4): 172.16.1.4 172.16.1.5 web01 web02 [root@m01 ~]# ansible 'web_group' -m shell -a 'df -h' # 查看磁盘 [root@m01 ~]# ansible 'lb_group' -m shell -a 'free -m' # 查看内存 #查看不同组不同机器的配置 #方式一:使用逗号隔开多主机 [root@m01 ~]# ansible '172.16.1.4,web01' -m shell -a 'free -m' web01 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 972 134 680 25 158 664 Swap: 1023 0 1023 172.16.1.4 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 972 110 738 7 124 715 Swap: 1023 0 1023 #方式二:使用-i参数指定临时hosts [root@m01 ~]# vim hosts #配一个临时的hosts文件 [web_group] web01 172.16.1.4 ansible_ssh_pass='admin123' [root@m01 ~]# ansible 'web_group' --list-host -i ./hosts hosts (2): web01 172.16.1.4 [root@m01 ~]# ansible 'web_group' -i ./hosts -m shell -a 'df -h'
4.定义多组整合
[root@m01 ~]# vim /etc/ansible/hosts [web_group] web01 web02 [lb_group] 172.16.1.4 ansible_ssh_pass='admin123' 172.16.1.5 ansible_ssh_pass='admin123' [db_group] 172.16.1.51 ansible_ssh_pass='admin123' 172.16.1.52 ansible_ssh_pass='admin123' #定义多组,整合web_group组合lb_group组 [nginx_group:children] #如果不加:children,下面的组名会被当成主机名 web_group lb_group #测试 [root@m01 ~]# ansible 'nginx_group' -m ping #查多组整合的主机列表 [root@m01 ~]# ansible nginx_group:children --list-host [WARNING]: Could not match supplied host pattern, ignoring: children hosts (4): web01 web02 172.16.1.4 172.16.1.5
测试主机清单连接
[root@m01 ~]# ansible 'web01' -m ping 10.0.0.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, # 没有变化 "ping": "pong" } [root@m01 ~]# ansible '*' -m ping #*代表所有 ... [root@m01 ~]# ansible 'all' -m ping #all代表所有 [root@m01 ~]# ansible 'web01,web02' -m ping #支持逗号
标签:配置文件,46,172.16,ansible,hosts,ssh,m01,root From: https://www.cnblogs.com/ludingchao/p/17985668