分类 Default 下的文章 - MemoryCloud Blog
首页
关于
推荐
Airport
SVG_
Gif_
API
搜 索
1
资源控制器之RS
53 阅读
2
扬帆起航
52 阅读
3
Cgroups资源限制
50 阅读
4
Kubernetes节点与 Pod 亲和性
49 阅读
5
Golang的原子属性
39 阅读
Default
Golang
Cloud Compute
Kubernetes
EveryDay
登录
/
注册
搜 索
标签搜索
原创
Kennedy
累计撰写
19
篇文章
累计收到
1
条评论
首页
栏目
Default
Golang
Cloud Compute
Kubernetes
EveryDay
页面
关于
推荐
Airport
SVG_
Gif_
API
用户登录
登录
注册
找到
3
篇与
相关的结果
2023-12-02
今天天气和往常不一样
呼吸一下外面的空气挺好的 久违的新鲜感
2023年12月02日
17 阅读
0 评论
0 点赞
2023-09-16
扬帆起航
又是新的起点,希望你越来越强!
2023年09月16日
52 阅读
1 评论
0 点赞
2022-12-13
Ansible
部署密钥认证免密码登录、双机互信一些服务在使用前要求做密钥认证,管理轻松。手动写批量管理脚本。==注:密钥认证是单向==密钥对 公钥:public key 一般以.pub结尾 私钥:private key角色主机名IP管理机m01192.168.10.50被管理机nfs01192.168.10.51被管理机web01192.168.10.52被管理机backup192.168.10.53常规密钥无密钥前检测#ping ...... #22端口 sshd服务开启或可以访问 [root@m01 ~]# nmap -p 22 nfs01 web01 buckup Starting Nmap 6.40 ( http://nmap.org ) at 2024-03-10 21:03 EDT Nmap scan report for nfs01 (192.168.10.51) Host is up (0.00013s latency). PORT STATE SERVICE 22/tcp open ssh MAC Address: 00:0C:29:53:DD:74 (VMware) Nmap scan report for web01 (192.168.10.52) Host is up (0.00025s latency). PORT STATE SERVICE 22/tcp open ssh MAC Address: 00:0C:29:29:8F:D8 (VMware) Nmap scan report for buckup (192.168.10.53) Host is up (0.00022s latency). PORT STATE SERVICE 22/tcp open ssh MAC Address: 00:0C:29:3A:62:EB (VMware) Nmap done: 3 IP addresses (3 hosts up) scanned in 0.42 seconds创建密钥[root@m01 ~]# ssh-keygen -t rsa Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. 公钥和私钥 [root@m01 ~]# cd /root/.ssh/ [root@m01 .ssh]# ls id_rsa id_rsa.pub known_hosts #都是加密的分发公钥[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@buckup测试ssh root@192.168.10.51公钥分发的位置[root@nfs01 ~]# cd /root/.ssh/ [root@nfs01 .ssh]# ls #位置不变 密钥文件名改变 authorized_keys自动创建与分发密钥集群数量庞大,无法每个单独配置阻碍:1.创建密钥对2.分发公钥的时候:yes/no(yes会保存到 .ssh/know_hosts)3.分发公钥的时候:输入密码sshpass作用sshpass适用于ssh相关的命令提供密码:ssh,scp,ssh-copy-idexpect,用户实现非交互式判断,认证操作 yes/no#在无密钥认证的时候 使用ssh不可加参数也必须交互式输密码 [root@m01 ~]# sshpass -proot ssh nfs01 -p指定密码 ssh是指定命令注意:sshpass,ssh-copy-id第一次连接,如果提示yes/no,则sshpass失效!创建密钥参数[root@m01 ~]# ssh-keygen -f ~/.ssh/id_rsa -P '' -f 参数用于指定私钥位置 -P 参数是密码短语 设置为空 #创建密钥时 就不需要回车分发密钥[root@m01 ~]# sshpass -proot ssh-copy-id -i ~/.ssh/id_rsa.pub buckup #分发公钥时就不需输入密码第一次建立连接yes/no#非建立连接过的主机在ssh,ssh-copy时会提示yes/no #建立连接后的主机信息会记录在/root/.ssh/know_hosts中 #在建立连接时 -oStrictHostKeyChecking=no 临时不检查主机信息(know_hosts) [root@m01 ~]# ssh nfs01 The authenticity of host 'nfs01 (192.168.10.51)' can't be established. ECDSA key fingerprint is SHA256:p6P+DDIogoJ7Q4OMmGs18IftWDwEWR4TEhiJ5SptmZU. ECDSA key fingerprint is MD5:6a:c1:a5:66:a0:f6:38:11:ac:72:a7:ca:8a:fe:87:18. Are you sure you want to continue connecting (yes/no)? [root@m01 ~]# ssh-copy-id -oStrictHostKeyChecking=no nfs01 解决建立连接时yes/no提示 [root@m01 ~]# sshpass -proot ssh-copy-id -oStrictHostKeyChecking=no nfs01 #解决yes/no以及密码提示脚本执行[root@m01 ~]# cat sshkey.sh #!/bin/bash #auther: To9cn #version: v1 #desc: 自动创建密钥对 自动分发公钥 passwd=root ips="192.168.10.51 192.168.10.52 192.168.10.53" #环境判断 是否联网、是否可以使用yum... yum install -y sshpass #创建密钥对 if [ -f ~/.ssh/id_rsa ] then echo "密钥对存在!" sleep 1 else echo "密钥对不存在; 开始创建密钥对..." ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' &>/dev/null sleep 1 echo "密钥对创建成功!" fi #分发公钥 for ip in $ips do sshpass -p$ ssh-copy-id -oStrictHostKeyChecking=no $ip echo "$ip 成功分发密钥!" sleep 1 done检查脚本测试无密钥的连通性[root@m01 ~]# cat test_ssh.sh #!/bin/bash #auther: To9cn #desc: 批量执行命令 for ip in 192.168.10.51 192.168.10.52 192.168.10.53 do ssh $ip hostname done [root@m01 ~]# ./test_ssh.sh nfs01 web01 buckupAnsible自动化运维:批量管理、批量分发、批量执行与维护...导图:https://www.processon.com/view/link/61addd266376896056c1b1b2任务:熟练脚本部署密钥认证Ansible批量管理结构Ansible主机清单(添加、管理集群)Ansible常用模块Ansible-批量管理-批量部署-批量分发Ansible管理架构Inventory :主机清单---被管理主机的IP列表,分类。ad-hoc模式:==命令行==批量管理(使用模块),临时任务。playbook:剧本模式---把操作写出脚本,可重复运行这个脚本Ansible模块概述:ansible中的模块就类似于Linux中的命令,我们Linux命令管理系统,我们通过ansible模块实现批量管理.ansible中模块一般相当于Linux中的一些命令.yum模块,file模块,user模块.ansible中的模块拥有不同的选项,这些选项一般都是一些单词.有自己格式和要求Ansible模块 modules Ansible中通过各种模块实现批量管理.一般来说这些模块对应着Linux里面的基本操作或服务管理。找出Linux场景操作对应的模块即可.Ansible安装epel源yum -y install epel-release yum -y install vconfig -y yum install -y ansible [root@m01 ~]# ansible --version ansible 2.9.27优化配置修改配置文件关闭Host_key_checking(yes/no)修改配置文件开启日志功能[root@m01 ~]# vim /etc/ansible/ansible.cfg 71行:关闭主机检测 112行:开启日志功能 [root@m01 ~]# egrep -vn '^$|#' /etc/ansible/ansible.cfg 11:[defaults] 72:host_key_checking = False 112:log_path = /var/log/ansible.log 328:[inventory] 341:[privilege_escalation] 347:[paramiko_connection] 371:[ssh_connection] 432:[persistent_connection] 446:[accelerate] 461:[selinux] 470:[colors] 486:[diff]Ans-Inventory主机清单主机清单格式[分类或组的名字] #服务器集群用途 IP或主机名或域名 #主机名要解析(etc/hosts)ansible管理的主机节点的列表---默认读取/etc/ansible/hosts,一般会把清单放在指定位置。## db-[99:101]-node.example.com [nfs] 192.168.10.51 [web] 192.168.10.52 [buckup] 192.168.10.53没有公钥的主机清单配置(不推荐)[nfs] 192.168.10.51 ansible_user=root ansible_password=123 ansible_port=22测试[root@m01 ~]# ansible all -m ping #-m指定模块 #all可以替换为nfs,web等分组内容,也可写IP单必须在主机组 192.168.10.53 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } #获取被管理节点 系统信息 [root@m01 ~]# ansible all -a "cat /etc/os-release" 192.168.10.51 | CHANGED | rc=0 >> NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/"子组期望对backup,nfs两组,再创建新分组data:[data:children]#创建新分组,包含已有的分组backup,nfs [data:children] nfs backup [root@m01 ~]# ansible data -m ping 192.168.10.51 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }Ansible模块模块的本质是替换Linux命令。模块有不同选项(单词),有自己的格式查看ansible全部模块ansible-doc -l #全部模块 ansible-doc -s file #搜索模块、找模块参数模块分类模块命令和脚本模块command模块 默认模块 执行简单命令,不支持特殊符号 shell模块 执行命令 支持特殊符号 script模块 分发脚本并执行文件file 创建目录,文件,软连接 copy 远程分发文件,修改权限,所有者,备份服务systemd服务管理 service 服务管理(了解)软件包yum源 yum_repository yum命令 get_url下载软件系统管理mount模块 挂载 cron模块 定时任务用户管理group模块 管理用户组 user模块 管理用户其他压缩解压(unarchive),rsync模块(synchronize),数据库模块(mysql_db,mysql_user)...调试模块ping检测ansible与其它节点连通性 debug模块 检查、显示 变量 命令和脚本1.command模块是ans默认模块,适用于简单命令,不支持特殊符号[root@m01 ~]# ansible all -m command -a "hostname" #-m 指定模块,-a模块的选项(命令);command也是默认模块 可以不写 # ansible all -a "hostname" 192.168.10.53 | CHANGED | rc=0 >> buckup 192.168.10.52 | CHANGED | rc=0 >> web01 192.168.10.51 | CHANGED | rc=0 >> nfs012.shell模块与command模块相似,但支持特殊符号(==避免因特殊符号和引号导致的问题==)ansible all -m shell -a 'rm -rf /tmp/*' #可用双引号批量获取IP[root@m01 ~]# ip a s ens33 | awk -F'[/ ]+' 'NR==3' 192.168.10.50 [root@m01 ~]# ansible all -m shell -a "ip a s ens33 | awk -F'[/ ]+' 'NR==3'" #“”转义特殊符号,\转义‘’号中的特殊符号 192.168.10.52 | CHANGED | rc=0 >> 192.168.10.52 192.168.10.51 | CHANGED | rc=0 >> 192.168.10.51 192.168.10.53 | CHANGED | rc=0 >> 192.168.10.53shell模块不推荐执行较为复杂的命令,如果需要,可放在脚本中执行3.script模块1.分发脚本(传输脚本),在被管理端执行脚本2.运行脚本注:被控制节点执行完脚本后才有反馈[root@m01 script]# cat xuntest.sh #!/bin/bash #auther: To9cn #desc: 系统巡检脚本 hostname hostname -I ip a s ens33 | awk -F'[/ ]+' 'NR==3' uptime whoami date +%F sleep 3 #模块执行 [root@m01 script]# ansible all -m script -a '/root/script/xuntest.sh' #被管理端ps -ef | grep ansible 可查看临时脚本文件路径 [root@nfs01 ~]# ps -ef | grep ansible root 11774 11749 0 21:58 pts/0 00:00:00 /bin/sh -c /root/.ansible/tmp/ansible-tmp-1710208685.15-15173-53973950998774/xuntest.sh && sleep 0 #执行玩脚本以后文件自动删除4.debug模块执行Ansible在命令行只会显示OK,Changed等,debug模块可自定义==控制台输出内容==[root@m01 playbook]# ansible all -m debug -a "msg='hello word'" #剧本模式 debug: msg: "Test Debug"-v参数[root@m01 test]# ansible -i inventory web --list-hosts -v #显示cfg的配置文件 Using /etc/ansible/ansible.cfg as config file hosts (1): 192.168.10.52文件相关模块1.file模块管理文件、目录、软连接file模块把touch、mkdir、rm、ln等命令结合在一起file模块模块说明==path==目录、文件路径 必写src源文件一般用link(创建软连接) 用于指定源文件==state==状态(模式)state=directory 创建目录state=file(默认) 更新文件,若文件不存在不创建state=link 创建软连接state=touch 创建文件==state==state=absent 删除 (如果是目录递归删除目录) modemode=755 创建并修改权限owneronwer=rootgroupgroup=root 被控制节点批量创建删除文件、目录[root@m01 ~]# ansible all -m file -a "path=/opt/test.sh state=touch" #删除 [root@m01 ~]# ansible all -m file -a "path=/opt/test.sh state=absent" [root@m01 ~]# ansible all -m file -a "path=/root/test/abc/ state=directory" #支持创建多级目录 #软连接 ansible all -m file -a "path=/opt/hosts src=/etc/hosts state=link" #path是创建后叫什么放哪 src是源文件 #检测 [root@m01 ~]# ansible all -a 'ls -l /opt/hosts' 192.168.10.53 | CHANGED | rc=0 >> lrwxrwxrwx. 1 root root 10 Mar 11 23:00 /opt/hosts -> /etc/hosts 192.168.10.52 | CHANGED | rc=0 >> lrwxrwxrwx. 1 root root 10 Mar 11 23:00 /opt/hosts -> /etc/hosts 192.168.10.51 | CHANGED | rc=0 >> lrwxrwxrwx. 1 root root 10 Mar 11 23:00 /opt/hosts -> /etc/hosts #owner修改所有者;推荐在创建时指定属主、权限... [root@m01 ~]# ansible all -m file -a "path=/testmdr/ owner=root group=root mode=777 state=directory" #属主和组必须存在才可成功 #控制节点检测 [root@m01 ~]# ansible all -a 'ls -ld /testmdr'2.copy模块批量分发:scp,管理节点发送文件到所有被管理端注:copy传输是单向的copy模块 ==src==source 源文件,管理端的文件(不推荐传目录)==dest==destnation 目标;被管理端的目录文件backupbackup=yes 在覆盖前进行备份(文件存在且不一样会备份)mode修改权限owner修改为指定所有者group修改为指定用户组 扩展:fetch拉取3.lineinfile修改文件内容:类似sed -i 'sg' , sed 'cai'path 指定文件、create 如果文件不存在是否创建(true/false)regexp 正则 只换正则匹配的内容(匹配多行只修改最后一行)4.replace替换多行模块服务管理-systemdsystemd模块相当于Linux systemd命令:开启,关闭,重启服务开机自启服务systemd模块 ==name==指定服务名称==enabled==yes开机自启==state==表示服务开关重启state=started 开启state=stopped 关闭state=reloaded 重读配置文件state=restarted 重启daemon-reloadyes是否从新加载对应的服务管理配置文件自定义配置文件 #开启crond服务(集群)并设置开机自启 [root@m01 ~]# ansible all -m systemd -a "name=crond enabled=yes state=started" #开启,关闭防火墙 [root@m01 ~]# ansible all -m systemd -a "name=firewalld enabled=yes state=started" [root@m01 ~]# ansible all -m systemd -a "name=firewalld enabled=no state=stopped" 扩展:systemd适用于大部分Linux系统;service模块适用于旧的系统软件管理yum模块get_url模块,wget命令yum_repository模块,yum配置模块,可通过copy模块实现。1.yum模块yum模块不只是yum命令,包含==yum,apt==命令yum模块 name指定软件包名字;可以指定==多个==,用 “ , ”分割。stateinstalled 安装(present(默认))removed 删除(也可写为absent)lastest 安装或更新update_cache设置为no加速,表示不更新yum缓存,建议开启 #安装常用软件htop,tree,lrzsz [root@m01 ~]# ansible all -m yum -a "name=htop,tree,lrzsz update_cache=yes state=present" 2.get_url模块相当于wget命令,所有主机有网络才可推荐在管理节点下载好,使用copy仅分发即可get_url下载功能 url指定下载路径,地址dest下载到本地哪个目录validate_certs默认yes,no跳过https(SSL报错) #zabbix-agent地址为:#https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm 下载zabbix到/app/tools下 #创建目录 [root@m01 ~]# ansible all -m file -a "path=/app/tools state=directory" #控制节点下载zabbix [root@m01 ~]# ansible all -m get_url -a "url='https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm' dest=/app/tools" #yum安装 [root@m01 ~]# ansible all -m yum -a "name=/app/tools/zabbix-agent-6.0.13-release1.el7.x86_64.rpm state=installed update_cache=no" ==有时wget识别不了https,需要加上 --no-check-certificate 参数==wget --no-check-certificate XXXXXX3.yum_repository模块用处不是很多推荐:未来在单独目录下书写好yum配置文件,copy分发过去即可。yum源模块 yum_repository nameyum源中的名字 [Centos]descriptionyum源中的注释说明 对应的 是name的内容baseurlyum源中 baseurl 下载地址enabled是否启动这个源 yes/nogpgcheck是否启动gpgcheck功能 no(校验官方,许可等)file指定yum源文件 自动添加.repo 默认与模块名字一致 与普通yum文件区别[name]name=centos 默认为源文件的文件名name=centosdescription="" 描述enabled=1enabled=yesgpgcheck=0gpgcheck=no 用户管理user用户管理:useraddgroup用户组管理:groupadd1.user模块user模块 name用户名uid指定uidgroup指定用户组,用于事先创建好了用户组 通过选项指定shell指定命令解释器create_home是否创建家目录(yes/no)statepresent 添加absent 删除password更新密码 #创建www-ans用户uid 2000 [root@m01 ~]# ansible all -m user -a "name=www-ans uid=2000 shell=/sbin/nologin create_home=no state=present" [root@m01 ~]# ansible all -a "grep www-ans /etc/passwd"#带密码 ansible all -m user -a "name=wang password=} state=present" #'wang'是随机加的字符 #sha512加密格式输出加密后的结果 [root@m01 ~]# ansible all -i localhost, -m debug -a "msg=}" localhost | SUCCESS => { "msg": "$6$wang$8N45KDaHJsVGx6VQSjHS8helqldy7geS/zTb739WyuoPNxdW49B55l5SoCxg8rx5hv/O791edTg5k5C3QV/5a0" } #使用加密后的msg作为密码 ansible all -m user -a "name=liu1 password='$6$wang$8N45KDaHJsVGx6VQSjHS8helqldy7geS/zTb739WyuoPNxdW49B55l5SoCxg8rx5hv/O791edTg5k5C3QV/5a0' state=present" #等价于密码1 #shell模块更新密码 [root@m01 ~]# ansible all -m shell -a "echo 1 | passwd --stdin liu" 192.168.10.53 | CHANGED | rc=0 >> Changing password for user liu. passwd: all authentication tokens updated successfully. 关于}解释} 1表示密码,经过管道,传递给password_hash()插件,sha512加密算法,wang是随机字符用于生成加密后的密码。2.group模块group name指定用户组名字gid指定组idstatepresent 添加absent 删除 mount模块实现mount命令进行挂载,且可修改/etc/fstab实现永久挂载。mount fstype指定文件系统;xfs,ext4,iso9660,nfssrc源地址(nfs地址 eg 192.168.10.50/data)path挂载点(把源挂载到哪里)state见下表 mount的state参数可用值 ==absent==卸载并修改fstabunmounted卸载不修改/etc/fstabpresent仅修改/etc/fstab 不挂载==mounted==挂载并修改/etc/fstabremounted从新挂载 定时任务cron用于管理系统的定时任务,替代了crontab -e功能cron模块说明name定时任务名字(必加),对应下面==注释==内容minute分钟 minute="/2"hour小时day日期month月份week周几job指定命令或脚本(定向到空) job="/sbin/ntpdate ntp1.aliyum.com &>/dev/null"statepresent 添加定时任务(默认)absent 删除 #添加定时同步时间任务 */2 * * * * /sbin/ntpdate ntp1.aliyum.com &>/dev/null ansible all -m cron -a 'name="10.sync time wang" minute="*/10" job="/sbin/ntpdate ntp1.aliyum.com &>/dev/null" state=present' #被控制节点查看任务 [root@nfs01 ~]# crontab -l #Ansible: 10.sync time wang */10 * * * * /sbin/ntpdate ntp1.aliyum.com &>/dev/null #删除任务 name + state ansible all -m cron -a 'name="10.sync time wang" state=absent'清理已有的定时任务#使用sed替换 [root@m01 ~]# ansible all -a "sed -i '/ntpdate/d' /var/spool/cron/root" #但注释还在 [root@nfs01 ~]# crontab -l -u root #Ansible: 10.sync time wang集群批量管理-Ansible-剧本-变量剧本:可以书写部署服务脚本rsync、nfs、sersync变量:类似脚本,在剧本使用剧本playbook 文件;用于长久保存并实现批量管理,维护,部署的文件脚本中存放命令和变量,剧本中存放==模块==剧本yaml格式;yaml格式的文件:空格,冒号剧本和hoc区别 ans剧本ans ad-hoc共同点批量管理,使用模块批量管理,使用模块区别重复调用不方便重复调用应用场景部署服务,多个步骤任务测试模块,临时性任务 [root@m01 playbook]# cat 01.show.yml --- - hosts: all tasks: - name: 01 起床 shell: echo 01 >> /tmp/everyday.log - name: 02 刷牙 shell: echo 02 >> /tmp/everyday.log - name: 03 吃早餐 shell: echo 03 >> /tmp/everyday.log==剧本hosts指定多个集群 :====- hosts: nfs:web:buckup==192.168.10.51 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.10.52 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.10.53 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 #剧本执行命令 ansible-playbook 01_test.yml #检测剧本语法 ansible-playbook 01_test.yml --syntax-check #奶牛优化 [root@m01 playbook]# ansible-playbook 01.show.yml #修改etc/ansible/ansible.cfg 随机图案 cow_selection = random #打开注释 #剧本目录下最好有/ansible/hosts文件 ansible-playbook -i hosts 02_file.yml #-i 指定主机清单注:==同级内容对齐、不同层级隔两个空格、不可用tab键==剧本案例1.创建并分发文件1.创建目录 /server/files/2.把 /etc/hosts 文件发送到 /server/files/#创建目录server/files/ ansible all -m file a "path='/server/files/' state=directory" #分发 ansible all -m copy a "src=/etc/hosts dest=/server/files/"剧本模式[root@m01 playbook]# cat 02.file.yml --- - hosts: all tasks: - name: 01 Creat file file: path=/server/files/ state=directory - name: 02 Copy file copy: src=/etc/hosts dest=/server/files/==冒号格式(专业格式);==[root@m01 playbook]# cat 02.file.yml --- - hosts: all tasks: - name: 01 Creat file file: path: /server/files/ state: directory - name: 02 Copy file copy: src: /etc/hosts dest: /server/files/2.安装软件分发安装包、安装软件、启动服务zabbix-agent软件包(下载)安装软件包配置(略)开机自启==步骤--->模块--->剧本== ==测试:分步测试==#下载安装包 wget https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm #安装软件 yum install -y zabbix-agent-6.0.13-release1.el7.x86_64.rpm #启动 systemctl模块#下载: get_url(url) #安装:yum(installed) #启动:system剧本[root@m01 playbook]# cat 03_install_zabbix.yml --- - hosts: all tasks: - name: 01 ---创建下载目录 file: path: /root/zabbix/ state: directory - name: 03 ---下载安装包 get_url: url: https://mirrors.aliyun.com/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.13-release1.el7.x86_64.rpm dest: /root/zabbix/ validate_certs: no - name: 04 ---安装软件 yum: name: /root/zabbix/zabbix-agent-6.0.13-release1.el7.x86_64.rpm state: present - name: 05 ---设置自启 systemd: name: zabbix-agent enabled: yes state: started#检测 [root@m01 playbook]# ansible all -m shell -a "ps -ef | grep zabbix" 192.168.10.51 | CHANGED | rc=0 >> zabbix 14944 1 0 14:05 ? 00:00:00 zabbix_agentd zabbix 14945 14944 0 14:05 ? 00:00:06 zabbix_agentd: collector [idle 1 sec]3.nfs服务day40-9nfs服务端:在backup部署nfs服务,共享/backup-nfs目录,all_squash,nfsnobodynfs客户端:web挂载 /ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)服务端流程:1.部署nfs-utils2.修改配置文件3.创建共享目录,改所有者4.启动服务rpcbind,nfs客户端流程:1.安装nfs-utils2.挂载与永久挂载剧本模式#nfs Client --- - hosts: buckup tasks: - name: 01 Deploy nfs-utils,rpcbind yum: name: nfs-utils,rpcbind state: present - name: 02 Present system file lineinfile: path: /etc/exports line: "/buckup-nfs 192.168.10.0/24(rw,all_squash)" create: true - name: 03-1 Create Together file & Present User user: name: nfsnobody create_home: yes state: present - name: 03-2 Create Together file & Present User file: path: /buckup-nfs owner: nfsnobody group: nfsnobody state: directory - name: 04-1 Start Service(rpcbind,nfs) systemd: name: rpcbind enabled: yes state: started - name: 04-2 Start Service(rpcbind,nfs) systemd: name: nfs enabled: yes state: started #nfs Server - hosts: web tasks: - name: 01 Deploy nfs-utils yum: name: nfs-utils state: present - name: 02 Mount nfs mount: src: 192.168.10.53:/buckup-nfs path: /ans-upload fstype: nfs state: mountedAnsible变量可以定义变量的地方说明在剧本文件中定义比较常用.仅仅限于当前的play使用register变量(注册变量)ip=hostname-I实现脚本中反引号的功能,可以获取命令结果变量文件,根据主机清单分组进行定义变量如果多个剧本,使用相同的变量,大型的剧本rolesinventory主机清单中定义变量未来可以用于批量修改主机使用,其他很少用了facts变量一般用于获取主机基本信息:ip,主机名,系统(centos/ubuntu)如果不需要可以关闭,用于加速剧本的执行 1.在playbook定义变量仅在当前play生效,存放路径,用户名,ip...[root@m01 playbook]# cat 05_var_test.yml #var test --- - hosts: all vars: dir: /to9cn/wang/oldboy/a/b/c/ tasks: - name: Create directory file: path: "}" state: directory - name: debug tab debug: msg: "The vars: }:::" #不管多少空格只取变量值#检测 [root@m01 playbook]# ansible all -i hosts -a "tree /to9cn" 192.168.10.53 | CHANGED | rc=0 >> /to9cn └── wang └── oldboy └── a └── b └── c变量引号问题#变量只要是选项的开头 就必须加引号"" '' dir: /to9cn/wang/oldboy/a/b/c/ path: "}" #选项开头加引号 state: directory path: /root/script/} #非选项开头不加引号2.变量文件(共用)a. vars_files(变量文件)可在任意目录下创建此变量文件,可使用相对和绝对路径缺点:每个需要变量文件的剧本都==必须在开始调用变量文件==[root@m01 vars_group]# cat 01_var_test.yml --- - hosts: all vars_files: ./vars.yml # 若不是在同级目录,可直接使用相对目录 tasks: - name: 01 Print vars debug: msg: "vars: } } }"b.group_files(主机组文件)主机组清单变量文件在剧本文件的同级目录下创建group_vars目录,此目录中创建以主机组命名的目录;最后在主机组目录下书写变量文件(vars.yml);==playbook的同级目录下:group_vars/all(web nfs backup)/vars.yml==智能==自动识别,剧本不需引用==且可针对主机组指定变量#结构 [root@m01 vars_group]# ls 01_var_test.yml group_vars vars.yml [root@m01 vars_group]# tree . ├── 01_var_test.yml ├── group_vars │ └── all │ └── vars.yml [root@m01 vars_group]# cat group_vars/all/vars.yml user: wang(group) src: https://grpup_vars dest: /root/group_vars/vas/剧本删除变量文件引用[root@m01 vars_group]# cat 01_var_test.yml --- - hosts: all tasks: - name: 01 Print vars debug: msg: "vars: } } }" ok: [192.168.10.52] => { "msg": "vars: wang(group) https://grpup_vars /root/group_vars/vas/" } ok: [192.168.10.51] => { "msg": "vars: wang(group) https://grpup_vars /root/group_vars/vas/" } ok: [192.168.10.53] => { "msg": "vars: wang(group) https://grpup_vars /root/group_vars/vas/" }3.register变量注册变量实现脚本中的 `` 反引号功能 : ip='hostname -I' 期望得到ip通过shell等系统命令结果保存到Register变量中==stdout==全名是standard putput (标准输出)[root@m01 playbook]# cat 06_register.yml --- - hosts: all tasks: - name: 01 Get Server Time shell: date +%F register: result #接收命令获取结果给变量 - name: 02 Out result debug: msg: | "register all: }" # "register.stdout: }" ok: [192.168.10.52] => { "msg": "register.stdout: 2024-03-14" }"msg": "\"register all: {'stderr_lines': [], u'changed': True, u'end': u'2024-03-14 23:17:54.964215', 'failed': False, u'stdout': u'2024-03-14', #标准输出 u'cmd': u'date +%F', u'rc': 0, u'start': u'2024-03-14 23:17:54.960870', u'stderr': u'', u'delta': u'0:00:00.003345', 'stdout_lines': [u'2024-03-14']}\"4.facts变量==ans内置变量==ans内置变量,ans运行剧本的时候会有一个默认的TASK [Gathering Facts]。运行剧本的时候ans会收集每个主机的基本信息,这些信息形成的变量叫做facts变量.==facts变量setup模块获取==---- ansible web -m setup 变量归属与读取 "ansible_swapfree_mb": 2047, #前面只有8个空格的变量可直接使用 #八个空格 "ansible_swaptotal_mb": 2047, "ansible_system": "Linux",大于8个空格:每四个空格为一个归属,找到上级用 “ . ”读取到下级内容 "ansible_effective_user_id": 0, "ansible_ens33": { #八个空格 "active": true, "device": "ens33", "features": { "ipv4": { #上级为ansible_ens33 "address": "192.168.10.52", #上级为ipv4 "broadcast": "192.168.10.255", "netmask": "255.255.255.0", "network": "192.168.10.0"读取IP:==ansible_ens33.ipv4.address==剧本--- - hosts: all tasks: - name: 显示系统的基本信息 debug: msg: | 你的系统是} 你系统的版本是} 你主机名为} ok: [192.168.10.52] => { "msg": "你的系统是CentOS\n你系统的版本是7.5\n你主机名为web01\n" }常见的facts变量ansible_hostname #主机名 ansible_memtotal_mb #内存大小(总计)单位mb ansible_processor_vcpus #cpu数量 ansible_default_ipv4.address #默认的网卡ip eth0 ansible_distribution #系统发行版本名字 Centos Ubuntu Debian... ansible_distribution_version #系统的版本 ansible_date_time.date #时间在剧本中如果不需要用到facts内置变量,可以==关闭此任务提高自动化效率==。在tasks上注明:- hosts: web gather_facts: no tasks: - name: file: ...集群批量管理-流程控制-RolesAnsible流程控制==handler==when==loop==/with_items1.handler触发器修复服务的配置文件后---重启服务配置文件无变化,不重启服务,仅配置变化才重启应用场景:分发配置文件的时候---重启服务(或者做其他)格式: notify: name1 , handlers: -name1 -name2注意:handlers必须放在剧本最后,否则之后的剧本都认做handlers[root@m01 playbook]# cat 08.handler.yml --- - hosts: nfs gather_facts: no tasks: - name: Hand files copy: src: exports dest: /etc/exports backup: yes - name: Restart Service #无论文件如何变化 重启服务都会执行 systemd: name: nfs state: reloaded使用handler与notify[root@m01 playbook]# cat 08.handler.yml --- - hosts: nfs gather_facts: no tasks: - name: Hand files copy: src: /etc/exports dest: /etc/exports backup: yes notify: #如果检测到此任务Changed 匹配handler中的name并执行 - Restart Service - #可添加多个 handlers: #如果对应的任务状态不是Changed 不会执行handler - name: Restart Service systemd: name: nfs state: reloaded2.when判断用于给ans运行的task(模块)设置条件,满足或不满足条件在运行对应的模块.应用建议:when进行判断,一般与变量一起使用.when条件一般与facts变量或reqister变量较多.# 以系统类型为条件判断 分系统安装个需软件 [root@m01 playbook]# cat 09_when.yml - hosts: all tasks: - name: CentOS系统安装sl,cowsay,tree yum: name: sl,cowsay,tree state: present when: ansible_distribution == "CentOS" - name: Ubuntu系统安装cmatrix,lolcat apt: name: cmatrix,lolcat state: present when: ansible_distribution == "Ubuntu" # 若没条件判断,所有节点都会安装两任务的全部软件 when常见表达 == != is / is not match eg: is not match("web|backup") #支持正则 条件1 and 条件2 条件1 or 条件2 eg: when: ansible_distribution == "Ubuntu" and/or ansible_hostname is match("web|backup")3.循环with_items 与 loop场景:批量创建文件、添加用户、启动和重启服务"}"+with_items 与 "}"+loop用法一致重启多个服务(循环单个参数)[root@m01 playbook]# cat 10_loop.yml --- - hosts: buckup gather_facts: no tasks: - name: restart Service(rpcbind,nfs) systemd: name: "}" #item没有s state: restarted with_items: #loop: 效果和with_items:一样 loop没有s - rpcbind - nfs - sshd - crond为集群添加用户(循环多个参数: name uid passwd...)[root@m01 playbook]# cat 11_loop_more.yml --- - hosts: nfs gather_facts: no tasks: - name: Add User user: name: "}" uid: "}" state: present loop: - #整数不用加引号 - - # 参数前需要 " - "Ubuntu和Centos的细微差别#CentOS的 /bin/sh 指向bash [root@m01 playbook]# ll /bin/sh lrwxrwxrwx. 1 root root 4 Mar 8 06:32 /bin/sh -> bash #Ubuntu区别 # ll /bin/sh /bin/sh -> dash* #脚本语法部分不一样针对不同的系统优化添加playbook的解释器 user: name: "}" uid: "}" shell: /bin/bash # Ubuntu系统将会更改 解释器 state: presentAnsible剧本调试:one:剧本单步执行:two:tag标签:three:忽略错误1.单步执行-C --check 模拟运行,不做出改变(变量可能报错,因为没真正运行脚本)--syntax-check 只检查语法,不运行--step 单步运行:y执行这个task,n忽略这个task,c从当前开始自动运行2.tag标签(step改进)tag标签类似于超市物品的分类,只不过tag标签是给ansible中的task进行分类.加上标记;也就是单独对name moudle分类运行剧本的时候运行指定的tag标签或排除某些tag.==想单独运行部分板块或者不想运行部分板块==tags:==内容中不要有空格== [root@m01 playbook]# cat 12_tag.yml --- - hosts: buckup gather_facts: no tasks: - name: 01 Deploy nfs-utils,rpcbind yum: name: nfs-utils,rpcbind state: present tags: 1.install #针对独立name 进行标签 - name: 02 Present system file lineinfile: path: /etc/exports line: "/buckup-nfs 192.168.10.0/24(rw,all_squash)" create: true tags: 2.conf - name: 03-1 Create Together file & Present User user: name: nfsnobody create_home: yes state: present tags: 3.file - name: 03-2 Create Together file & Present User file: path: /buckup-nfs owner: nfsnobody group: nfsnobody state: directory tags: 4.user - name: 04 Start Service(rpcbind,nfs) systemd: name: "}" enabled: yes state: started loop: - rpcbind - nfs tags: 5.service-t 、--tags 运行的标签,如果多个标签则通过","分割--skip-tags 排除指定的tags,如果多个标签则通过","分割--list-tags 列出剧本的全部标签# 列出标签 [root@m01 playbook]# ansible-playbook --list-tags 12_tag.yml playbook: 12_tag.yml play #1 (buckup): buckup TAGS: [] TASK TAGS: [1.install, 2.conf, 3.file, 4.user, 5.service] # 运行tags板块1 [root@m01 playbook]# ansible-playbook -t 1.install 12_tag.yml # 运行板块1和2 [root@m01 playbook]# ansible-playbook -t 1.install,2.conf 12_tag.yml #板块之间无空格 #--skip-tags 除开选择的tags标签 剩余的标签全部执行 [root@m01 playbook]# ansible-playbook --skip-tags 2.conf,3.file,4.user,5.service 12_tag.yml #只执行 1.install3.忽略错误anisble在执行出错的时候终结剧本,不再执行后续程序因重复导致的错误提示(并非真错误,例如目录,用户已经存在) systemd服务名错误也能忽略通过 ignore_errors忽略错误,继续剧本ignore_errors: true true/false yes/no场景:才执行创建文件、目录、用户等操作时可加此参数- hosts: nfs tasks: - name: 01 Creat file file: path: /server/files/ state: directory ignore_errors: true #和tags一样与模块、name对齐Jinja2模板1.基本使用在分发文件时,文件中==需要使用变量==(facts,Clents_info,groups_vars)copy传输文件 文件纹丝不动传递==template会替换掉文件中的变量(.j2) 无需手动修改==文件必须以 .j2 结尾必须使用template模块(传输时替换j2文件中的变量)# 分发主机信息文件 [root@m01 templates]# cat 01_Jinja2_test.j2 ###################### welcome to oldboy elastic linux system 操作需谨慎,删根弹指间. 主机名: } ip地址: } 内存大小: } CPU数量: } 核心总数: } 发行版本: }# 剧本 [root@m01 templates]# cat 02_handj2.yml --- - hosts: nfs tasks: - name: Create (copy templates) file file: path: /root/jinja/ state: directory - name: template Hand J2 file template: src: /root/script/playbook/templates/01_Jinja2_test.j2 dest: /root/jinja/template backup: yes - name: copy Hand J2 file copy: src: /root/script/playbook/templates/01_Jinja2_test.j2 dest: /root/jinja/copy backup: yes #对比两模块 变量是否变化 # copy [root@m01 templates]# ansible nfs -m shell -a "cat /root/jinja/copy" 主机名: } ip地址: } #无法识别变量 # template 主机名: nfs01 ip地址: 192.168.10.512.判断使用判断和循环可存在在 .j2文件中# 条件判断 state Mater state Node 3.循环配置文件server.conf10.0.0.5 10.0.0.6 10.0.0.7 10.0.0.8 10.0.0.9 10.0.0.10 #适合不连续的 10.0.0.} #适合大范围连续的 10.0.0.} 集群批量管理-Ans-完结篇include文件包含1个ansible剧本内容过多,==涉及到多个play(-host:web)==,可读性变弱,不方便调试.于是人们想出把单个大的剧本拆分为多个,小的剧本.多个小的剧本可以通过include功能合并使用.缺点: 同级目录下存在多个yml文件、变量文件vars以及j2文件,板块较为混乱 不适合大型剧本拆分后的文件只包含tasks后面的部分:==不包含tasks的行==[root@m01 include]# cat 01_nfs_server.yml - name: 01 Deploy nfs-utils,rpcbind yum: [root@m01 include]# cat 02_nfs_client.yml - name: 01 Deploy nfs-utils,rpcbind yum: [root@m01 include]# cat 03_nfs_include.yml --- - hosts: buckup tasks: - include_tasks: 01_nfs_server.yml - hosts: web tasks: - include_tasks: 02_nfs_client.yml #handlersroles概述include将大型剧本模块化,但handlers、变量文件、发送配置文件(.j2)等比较混乱roles规则:这个规范是一套剧本目录结构的要求与标准,让我们书写剧本的时候,把剧本的内容和需要的文件,按照目录要求,分门别类存储。roles的本质就是规定了1套目录结构,用于书写剧本的.roles前提:熟练剧本模块,掌握服务流程;尽量==多使用变量==让剧本灵活性变高。[root@m01 include]# ls 01_nfs_server.yml 02_nfs_client.yml 03_nfs_include.yml # 可能还会设计多个变量、配置文件roles框架如果有自定义变量 ,在同级目录下有: group_vars/all/main.ymlnfs案例(S+C)Vault加密重要配置文件、参数文件涉密,需要通过加密保证安全ansible-vault encrypt 文件 :加密文件,直接读取是编码ans-hoc或ansible-playbook --ask-vault-pass 即可使用中解密ansible-vault decrypt 文件: 彻底解密(修改文件内容必须彻底解密)#加密文件 [root@m01 vault]# ansible-vault ansible-vault ansible-vault-2 ansible-vault-2.7 [root@m01 vault]# ansible-vault encrypt hosts New Vault password: Confirm New Vault password: Encryption successful [root@m01 vault]# cat hosts $ANSIBLE_VAULT;1.1;AES256 6638363062643933656664643233356...... #不解密情况下直接使用加密文件:无法识别#添加解密参数后: [root@m01 vault]# ansible --ask-vault-pass -i hosts nfs -m shell -a "ps -ef" Vault password: 192.168.10.51 | CHANGED | rc=0 >> #将加密文件彻底解密 [root@m01 vault]# ansible-vault decrypt hosts Vault password: Decryption successful #解密后才可对文件进行修改,也可直接识别和读取Galaxy别人的Roles:第三方、官方、用户的rolesansible-galaxy collection install#galaxy.ansible.com/search?deprecated=false&keywords=nginx&order_by=-relevance&page=1 #官网roles # 默认下载到家目录 ansible-galaxy collection install nginxinc.nginx_core下载失败可选择下载 ==tarbao==优化常见优化ssh连接速度优化,关闭UseDNS,GSSAPIAuthcation....不要让ansible运行交互式的命令,非要用使用命令的非交互模式.需要使用ans,yum安装软件,可以自建本地yum仓库,然后ans安装.(自建yum源,自己制作的rpm包)#ansible并发默认五台机器 -f FORKS, --forks FORKS specify number of parallel processes to use (default=5) #根据CPU的核心数提高需求给ansible配置缓存,队列。缓存(facts)给主机进行分组操作(web,nfs,backup)关闭gather_facts,如果不用facts变量可以关闭,剧本中:gather_facts:false配置文件:gathering = explicit关闭host,key,check一般使用密码认证的时候需要关闭,如果不关闭 ansible配置文件host_key_checking = False ==第一次ssh时的yes/no====安全==生产环境下一般不是ansible节点root远程集群root,默认会关闭root的远程权限,==ansible使用的时sudo提权的用户====配置sudo提权== ans ALL=(ALL) NOPASSWD: ALL 密码是1,ss端口22配合 vpn,jms一起使用用户--->vpn--->jms--->ansible用户密码、涉密文件、配置(bash,ansible-vault)==ansible---sudo==客户端# sudoers文件提权 [root@nfs01 ~]# tail -1 /etc/sudoers ans_sudo ALL=(ALL) NOPASSWD: ALL # 创建此用户 密码设置为1 [root@nfs01 ~]# useradd ans_sudo useradd: user 'ans_sudo' already exists [root@nfs01 ~]# passwd ans_sudo Changing password for user ans_sudo. New password: BAD PASSWORD: The password is a palindrome Retype new password: passwd: all authentication tokens updated successfully. [ans_sudo@nfs01 root]$ sudo -l User ans_sudo may run the following commands on nfs01: (ALL) NOPASSWD: ALL 管理端1.修改/etc/ansible/ansible.cfg文件:添加被管理端上的sudo用户和使用的用户(不指定默认是当前root用户/root) 2.开启sudo功能和命令 指定切换用户3.被管理端root禁止远程登录,密钥认证需要发给sudu用户;[root@m01 ~]# ssh-copy-id ans_sudo@192.168.10.51 ans_sudo@192.168.10.51's password: and check to make sure that only the key(s) you wanted were added.4.如果不使用sudo用户,需要关闭sudo以及sudo指定用户:不一定全部机器有sudo配置以及指定的用户;5.禁用root远程登录禁用root远程前,需要注册好普通用户,配置sudovim /etc/ssh/sshd_config systemctl restart sshd
2022年12月13日
10 阅读
0 评论
0 点赞