ansible自动化运维学习(2)

您所在的位置:网站首页 devops考试题 ansible自动化运维学习(2)

ansible自动化运维学习(2)

2023-03-22 14:27| 来源: 网络整理| 查看: 265

Ansible简介

必须掌握:ansible(CE考)

ansible命令使用场景:

非固化需求 临时一次性操作 二次开发接口调用 Ansible基于Python语言实现,由paramiko和PyYAML两个关键模块构建。Ansible的编排引擎可以出色地完成配置管理,流程控制,资源部署等多方面工作。

ansible主要承担的工作有以下几种:

配置管理 服务即时开通 应用部署 流程编排 监控告警 日志记录 Ansible公司负责Ansible开源软件的维护,管理 Ansible架构模式

Ansible维护模式通常由控制机和被管理机组成。因为Ansible的特性不像其他运维工具那样需要在被监控的目标上安装agent,所以我们的侧重点只需要放在安装了Ansible的服务器上(当然用于实验环境的话可以是一台笔记本,台式机或者仅仅只需要一台虚拟机即可)。

Ansible可以通过SSH进行远程链接到对端主机上,然后执行想要执行的playbook或者指令。所有的远程主机都可以在inventory中被定义。

Ansible中最亮眼的是集配置,部署,自动化于一身的playbook,playbook是ansible的核心,先掌握ansible的基本使用方式,再去掌握playbook

变量的检索位置 Playbook中vars目录下的文件 Roles中vars目录下的文件 Roles同级目录group_vars和hosts_vars目录下的文件 设置变量时尽量沿用同一种方式,以方便维护人员管理 Inventory文件配置 Inventory是Asible管理主机信息的配置文件,相当于系统HOSTS文件的功能, 默认路径/etc/ansible/hosts 【】Ansible命令 ansible使用模块来完成任务,比如安装软件,复制文件以及使用模板。 模块aret the way to use absible, 因为模块可以使用上下文来确定完成任务需要做些什么。 如果没有模块,我们只能运行shell命令,其实是使用的shell模块 ansible参数详解 -m:要执行的模块,默认为command -a:给模块传递参数 -b 成为另一个用户 --become-user=root 以用户root运行命令 -u:ssh连接的用户名,默认用root,ansible.cfg中可以配置 -k:提示输入ssh登录密码,当使用密码验证的时候用到 -s:sudo运行(sudo可以指定哪些用户拥有root权限) -U:sudo到哪个用户,默认为root -K:提示输入sudo密码,当不是NOPASSWD模式时使用 -C:只是测试一下会改变什么内容,不会真正去执行 -c:连接类型(default=smart) -f:fork多少进程并发处理,默认为5个 -i:指定hosts文件路径,默认default=/etc/ansible/hosts -I:指定pattern,对已匹配的主机中再过滤一次 --list-host:只打印有哪些主机会执行这个命令,不会实际执行 -M:要执行的模块路径,默认为/usr/share/ansible -o:压缩输出,摘要输出 --private-key:私钥路径 -T:ssh连接超时时间,默认是10秒 -t:日志输出到该目录,日志文件名以主机命名 -v:显示详细日志 举例: 1:以devops用户执行ping存活检测 ansible all -m ping -u devops 2:以devops sudo至root(默认拥有root权限)执行ping存活检测 ansible all -m ping -u devops -b 3:以devops sudo至user1(指定有user1权限)执行ping存活检测 ansible all -m ping -u devops -b --become-user user1 【】指定执行机器 定义主机和组 遵循从上到下依次匹配,逐级过滤。 Inventory可以直接为ip地址 172.25.78.2 端口号不是默认22端口时,可明确的表示为 server2:2222 server2 ansible_port=2222 ansible_host=172.25.78.2 []表示一个组,以可以表示一个范围 [test] www[1:10].example.com 172.25.78.2 172.25.78.3 【】定义主机变量: 在Playbook中使用时对主机进行个性化定制 [test] 172.25.78.2 172.25.78.3 [webserver:vars] ##使用80端口 http_port=80 定义组变量 [test] 172.25.78.2 [db] 172.25.78.3 [webserver:children] ##即包含test和db两个组 test db Ansible与正则 A 指定A组 A:B 指定A和B两个组 A:!B 指定在A组但不在B组 A:&B 指定同时在A组和B组 例如: 在test组但不在db组的主机,用感叹号表示 ansible "test:!db" -m ping 匹配所有主机,all与"*"功能相同: ansible '*' -m ping ansible all -m ping 匹配172.25.78.*网段的所有主机: ansible 172.25.78.* -m ping

前面是简单的介绍,下面进行实例进行深刻的认识

Ansible安装与配置 三台虚拟机 server1:配置上网

开启火墙,作为路由作用

1: 添加EPEL源,yum方式安装ansible vim /etc/yum.repos.d/epel.repo [epel] name=epel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ ##国内源比较快 gpgcheck=0 yum clean all yum repolist yum install ansible -y

2:查看主配置文件: vim /etc/ansible/ansible.cfg cd /etc/ansible/ --> ls /etc/ansible/ansible.cfg #主配置文件,配置ansible工作特性 /etc/ansible/hosts #主机清单 /etc/ansible/roles/ #存放角色的目录

vim hosts ##在文件末尾加入组 #不加组会默认一个组 [test] 172.25.78.2 172.25.78.3

3: ansible test -m ping ##会出错,因为没有输入密码

ansible test -m ping -k ##提示输入密码,,通过对一组服务器进行存活性检测 #检测主机的存活,返回ping则是正常,这里使用了-m参数,采用ping模块进行检测目标主机的存活性

#PS:这里需要注意的是,远程连接采用的不是单纯的ping命令,如果没有做ssh密钥认证,是会出现无法ping通的错误,此时可以采用-k参数,默认执行使用root用户进行连接远程主机。

在使用ansible时,我们会发现ssh链接较慢的现象,这里则需要修改sshd服务的两个参数来解决该问题:

UseDNS no GSSAPIAuthentication no

-a:给模块传递参数 ansible test -a hostname -k ##获取test组的主机名称,-a 给模块传递参数 ansible test -a uptime -k ##获取test组的主机时间

4:使用脚本 vim /etc/ansible/test.sh #!/bin/bash echo "hello word" ansible test -m copy -a "src=test.sh dest=/tmp/test.sh mode=755" -k ##将当前目录的test脚本复制到test组包含的主机/tmp/目录下,并且加入755权限,否则运行脚本时会报错没有权限 ansible test -m shell -a "/tmp/test.sh" -k ##测试运行脚本

复制成功

5:【server1】【server2】【server3】都加devops用户 为了方便不输入密码-k,则用普通用户去做实行免密 useradd devops id devops

为了安全起见,在三台主机上创建新的用户,并且在server1创建用户完成之后,创建ansible目录,进行试验

6:添加普通用户使用ansible 【server1】用普通用户去做 vim /etc/ssh/sshd_config ##超户下查看配置文件 切换到devops用户 su - devops mkdir ansible cd ansible vim ansible.cfg 编辑ansible主配置文件 [defaults] inventory = ./hosts 管理主机的清单

cp /etc/ansible/hosts . vim hosts [test] 172.25.78.2 [db] 172.25.78.3

ansible test -m ping -k ##会报错密码问题,需要免密

设置ssh免密登陆

【server2,server3】配置密码 echo westos | passwd --stdin devops

【server1】主机之间免密 server1与server2,3之间做免密 ssh-keygen ssh-copy-id 172.25.78.2 ##输入密码westos ssh-copy-id 172.25.78.3

passwd -l devops ##锁定指定devops用户的密码

测试: ssh 172.25.78.2 ##不需要做输入密码,即可登陆成功,则免密成功 ssh 172.25.78.3

ansible test -m ping ##在不需要-k参数下,直接ping出结果 ansible db -m ping ansible '*' -m ping ansible all -m ping 和"*"一样,都表示所有主机

ansible test -m copy -a "src=hosts dest=/tmp/hosts" ansible test -a "ls /tmp" 将本地的文件拷贝到远程主机(test组的主机)的tmp目录下面 这个是可以的,因为远程主机的devops用户对tmp目录有权限

将本地的文件拷贝到远程主机(test组的主机)的/mnt目录下面 这个是不可以的,因为server1和server2的 免密是devops用户的免密,devops用户对/mnt没有权限

ansible test -m copy -a "src=hosts dest=/mnt/hosts" ll -d /mnt/ ##报错权限问题,因为server2的/mnt权限为755,devops用户不能进行读写操作

在server2和server3上面授权,使devops具备root用户的权限 【server2,3】给devops用户设置权限,编写配置文件 visudo:好处就是有语法检测 visudo 93:devops ALL=(ALL) NOPASSWD: ALL

再次拷贝,发现就成功了 -b表示自动由devops用户转为root用户, 【server1】再次测试 cd /home/ansible id ansible test -m copy -a "src=hosts dest=/mnt/hosts" -b ##-b 不提示密码,不加参数会报错 也可以加入指定用户(意义是一样的) ansible test -m copy -a "src=hosts dest=/mnt/hosts" -u devops -b

现在不想使用-b转换身份,想直接默认使用root身份 vim /etc/ansible/ansible.cfg ##可以进行复制 340行:

vim ansible.cfg [defaults] inventory = ./hosts ##读取当前目录下的hosts文件 remote_user = devops ##表示以devops用户进行远程(remote)登陆 [privilege_escalation] become=True ##打开become开关 become_method=sudo ##将普通用户切换到root become_user=root ##设置为root用户 become_ask_pass=False ##不认证密码

使用devops的身份去检测

- u表示指定用户 可以看出以devops用户的身份去ping远程主机的devops用户是可以的 以devops用户的身份去ping远程主机的root用户是不可以的 记住:这里的用户指的都是远程主机的用户

定义组变量 创建webserver组,批量检测

[test] 172.25.78.2 [db] 172.25.78.3 [webserver:children] ##即包含test和db两个组 test db [webserver:vars] http_port=80

创建webserver组,批量检测 ping test组和db组 !db找出在test组里面但是不在组里db面的主机 &找出在test组里面也在prod组里面的主机

ansible的并发特性

ansible和Ansible-Playbook默认会fork 5个线程并发执行命令,如果同时操作的主机比较多的话,可以调整到一个更大的值 ansible有许多模块,默认是command,也就是命令模块,我们可以通过-m选项指定不同的模块

远程安装httpd并开启 【server1】 ansible test -m yum -a "name=httpd state=present" ##安装 ansible test -m service -a "name=httpd state=started" ##开启 测试:【server2】 ps ax | grep httpd

server1执行成功

例如:防火墙 ##查看有关firewall的命令 ansible-doc firewall ##进去以后输入firewall,会找到有关帮助

##开机自启(注意!!!开启server2的防火墙后再开机自启) ansible test -m firewalld -a "service=http state=enabled"

报错,防火墙没有开启

网页目录访问: server1: cd /home/devops/ansible/ mkdir apache vim apache/index.html www.westos.org ansible test -m copy -a "src=apache/index.html dest=/var/www/html" server2: iptables -L

server2:查看 cd /var/www/html/ cat index.html server1:进行访问 ansible test -m uri -a "url=http://172.25.78.2 return_content=yes" return_content=yes #此参数会返回默认发布目录的文件内容结果,如果不加参数,看不到返回的结果

查看帮助文档

mysql_user模块: server1远程安装: ansible test -m yum -a "name=mariadb-server" ansible-doc service ##查看相关帮助 启动数据库 ansible test -m service -a "name=mariadb state=started" server2:查看 ps aux server1: 创建数据库: ansible-doc mysql_db ##查看帮助 ansible test -m mysql_db -a "name=westos state=present"

安装数据库 安装成功

远程主机需要安装MySQL-python server2安装: yum install MySQL-python -y 也可以在server1 ansible test -m yum -a "name=MySQL-python state=present"

server2查看: mysql ##进入数据库 show databases;

server1创建数据库用户并且授权 ansible-doc mysql_user ansible test -m mysql_user -a "name=hd password=westos priv='westos.*:ALL' state=present host=%"

server2查看: select * from mysql.user where user='hd'\G;



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3