1.ansible极速上手指南
1.1批量管理工具选型
工具 说明 缺点 xshell 发送键输出到所有对话。不适应机器过多的场景,需要连接后才能用 for+ssh/scp+密钥认证 密钥认证,免密码登录scp传输文件/脚本ssh远程执行命令或脚本 串行(一台一台) saltstack 需要安装客户端(CS结构),底层环境(系统等)已经好了 ansible 无客户端(密钥认证)管理端安装ansible工具批量部署环境 是py写的,需要python解释器python版本不要太旧 红帽的 Terraform 关注基础设施(云环境),一键创建100台云服务器,一键创建负载均衡,数据库产品。管理底层环境。
1.2ansible架构
先配置好密钥认证
主机清单:通过主机清单(inventory)连接管理被控端。
2类用法:
ad-hoc:就是命令行执行模块
playbook:使用playbook剧本(核心)
1.3ansible的使用
环境准备 主机名 ip ansible管理端 m01(增加核心数 4c或8c) 10.0.0.61/172.16.1.61 被管理端: 其他所有机器 web01-04,nfs01,backup,db01-02,lb01-02…..
#如何部署ansible,使用pip工具安装.
pip 安装python软件包.
#1.安装pip工具
yum install -y python3-pip
#2.升级pip
python3 -m pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple --upgrade pip
#pip3 --version查看升级前pip 20.2.2 升级后pip 24.0
#3.pip源(加速pip下载软件)
pip3 config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
#4.安装ansible
pip3 install ansible
#5.配置ansible(yum安装配置文件默认存在)
mkdir -p /etc/ansible/ #创建配置文件存放目录
cat >/etc/ansible/ansible.cfg<<'EOF'
一些小故障
安装时会临时下载一些软件包和临时文件,放在tmp下,麒麟和欧拉/tmp/目录不是独立的,是tmpfs(内存),内存的四分之一,导致内存不足问题(模板机优化时已改) 解决 :1.systemctl mask tmp.mount 2.umount /tmp/3.重启检查结果
permission denied:一般是密钥认证没配或没配好
No route to host:一般是机器未开或防火墙拦截
配置主机清单文件
#1.配置好密钥认证(脚本分发密钥即可)
#2.配置主机清单文件
分组名字不要和主机名一样,一层一层分(lb,web,db,nfs,bak,cache),按环境分(prod,test,dev)
[root@m01 ~]# cat /server/ansible/hosts
#主机清单文件inventory
db nfs bak #3.使用 ansible -i /server/ansible/hosts all -m command -a ‘hostname -I’ #all 位置可以是分组名字具体分组(web/lb),ip,all所有 #-m 指定模块 -a 模块的选项/参数,内不支持别名 -i指定主机清单文件
ssh 172.16.1.5 hostname -I
ssh-copy-id命令没了,去openssh源码包find找复制到/bin/给权限.
1.4主机清单
.....
#创建data分组(可改),子组有db组,nfs组,bak组
需求:100台机器,100个不同密码如何做?
方法1:写循环(读取不同密码),分发密钥
方法2:写循环,生成主机清单文件
主机清单文件中指定密码(配合脚本生成此文件)
模块
ping模块,用来检查测试 检查密钥认证是否OK
command模块,默认的模块 不指定模块也是使用它
创建主机清单文件: -i 指定主机清单文件 默认读取/etc/ansible/hosts
分组(层次,环境,地区)
子组children(套娃)
主机清单文件里面指定用户名,密码,端口
1.5模块
命令行使用,一般是临时的
写在剧本中(playbook)
常用模块分类 模块 说明/选项 执行命令/脚本 command 默认的模块一般用于执行简单的命令不支持特殊符号 | , {} …“ $ shell 与command类似,支持特殊符号 script 1.分发脚本(管理端指定的文件)2.执行脚本(运行)3.自动删除脚本 文件/目录 file touch,mkdir,rm,chown,chmod,ln -s文件,目录,软连接path=路径(指定目录,目录下文件)src=源文件(给它创建软连接)mode=0644,0755 owner(用户得存在) groupstate=touch(文件)/directory(目录)/link(软连接)/absent(删除) 用户模块 user useradd,userdel,passwd批量添加普通/虚拟用户name(必写)uidgroupshellcreate_homepassword(比较复杂)state=present(添加) absent(删除) 用户组模块 group name gid state=present(添加) absent(删除) 安装软件包 yum/apt name=软件包名字(可接多个)state=present(安装) absent(删除) latest(更新) 分发配置文件 copy 类似于scp命令,分发配置文件,压缩包,不要分发目录!!(很慢)src=管理机某个位置的文件dest=被管理机还可以增加: mode=0644,0755 owner groupbackup 服务管理 systemd 服务管理:开机自启动,开启,关闭,重启name=服务名字enabled=是否开机自启动yes/no true/falsestate=started,stopped,restarted,reloadeddaemon_reload=true/false 传输压缩包并解压(解压tar包)(和copy很像) unarchive 还可以改所有者,用户组,权限src=指定压缩包dest=目标 修改文件内容(少)以行为单位 lineinfile 还可以改owner,group,modepath=指定要修改的文件regexp=匹配正则(去掉这个,line就是追加功能)line=修改为这里指定的内容 输出至命令行 debug msg选项
1)command,shell,script模块
#1.command模块
[root@m01 ~]# ansible -i /server/ansible/hosts db -m command -a 'touch {01..03}.txt'
[root@db01 ~]# ll
-rw-r--r-- 1 root root 0 11月 10 17:04 {01..03}.txt
#2.shell模块
[root@m01 ~]# ansible -i /server/ansible/hosts db -m shell -a 'touch {01..03}.txt'
[root@db01 ~]# ll
-rw-r--r-- 1 root root 0 11月 10 17:05 01.txt
-rw-r--r-- 1 root root 0 11月 10 17:05 02.txt
-rw-r--r-- 1 root root 0 11月 10 17:05 03.txt
#3.script模块(参数内不用写bash)
[root@m01 ~]# ansible -i /server/ansible/hosts db -m script -a '/server/scripts/ceshi.sh'
2)file模块
查看帮助
1.ansible-doc -s file #-s 搜索模块 找其选项
2.官网
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html
3)user用户/group用户组模块
#1.useradd 添加用户
useradd lidao
ansible -i hosts all -m user -a 'name=lidao state=present'
#2.添加虚拟用户
useradd -s /sbin/nologin -M www-ans
ansible -i hosts all -m user -a 'name=www-ans shell="/sbin/nologin" create_home=false state=present'
#3.web和nfs服务器上添加虚拟用户 指定uid,gid
groupadd -g 2999 www-nfs
useradd -u 2999 -g www-nfs -s /sbin/nologin -M www-nfs
#groupadd
ansible -i hosts web:nfs -m group -a 'name=www-nfs gid=2999 state=present'
#useradd
ansible -i hosts web,nfs -m user -a 'name=www-nfs group=www-nfs uid=2999 shell="/sbin/nologin" create_home=false state=present'
4)批量修改密码
5)yum/apt copy systemd模块
#1.安装软件:yum/apt
# name=指定软件包名字(可接多个) state=present/absent/latest(更新)
ansible -i hosts all -m yum -a 'name=tree,telnet,lrzsz state=present'
#2.分发配置文件 copy (文件-->发到被管理端)
# 推荐分发文件或压缩包,别分发目录(很慢)
# src=源文件或目录 dest=目标 backup=是否要备份(若文件存在,2个文件内容不一致,替换前做备份)
ansible -i hosts all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=true'
#3.systemd服务管理模块
# reloaded restarted started stopped
#开启nginx 并设置开机自启动
ansible -i hosts web -m systemd -a 'name=nginx enabled=true state=started'
#关闭firewalld 并禁止开机自启动
ansible -i hosts all -m systemd -a 'name=firewalld enabled=false state=stopped'
总结
主机清单文件
ans模块
预习剧本(playbook)
部署服务流程(rsync,nfs,nginx,php,tomcat,mysql,redis,linux优化等)
3.ansible剧本与变量
3.1ansible剧本
playbook剧本
你就是导演编剧,编排电影里面的,男女主人公,剧情等
剧本:导演/编剧写的剧本
演员:所有主机,主机清单
剧情:指定主机,执行什么模块(任务)
目标对应的服务器是主机清单中的机器/分组。
剧本中注意事项:
1️⃣对齐,空格2个,禁止使用tab键
2️⃣yml或yaml结尾
#1.创建剧本存放的目录
mkdir -p /server/ansible/
#2.进入此目录
cd /server/ansible/
#3.把主机清单文件移过来(默认在/etc/ansible/hosts下)
mv /etc/ansible/hosts .
#4.简单测试
ansible -i hosts all -m ping
#5.安装cowsay美化输出
yum install -y cowsay
#6.书写一个简单的剧本
[root@m01 /server/ansible]# cat 01.ceshi.yml
- hosts: all
tasks:
- name: 01打开冰箱
shell: echo 01.open >>/tmp/bingxiang.log #剧本中输出不在屏幕,需追加至文件
- name: 02把大象放入
shell: echo 02.put >>/tmp/bingxiang.log
- name: 03关门
shell: echo 03.close >>/tmp/bingxiang.log
#7.运行剧本
ansible-playbook -i hosts 01.ceshi.yml #-C 检查(模拟运行看是否OK)
1)部署tomcat
[root@m01 /server/ansible]# cat 01.tomcat_install.yml
- hosts: web
vars:
- dir: /app/tools/
tasks:
- name: 01安装openjdk11
yum:
name: java-11-openjdk
state: latest
- name: 02创建目录
file:
path: "{{ dir }}"
state: directory
- name: 03分发tomcat压缩包并解压
unarchive:
src: ./apache-tomcat-9.0.111.tar.gz #在剧本目录下,相对路径即可
dest: "{{ dir }}"
- name: 04创建软连接
file:
src: /app/tools/apache-tomcat-9.0.111
path: /app/tools/tomcat
state: link
- name: 05分发systemctl配置文件
copy:
src: ./tomcat.service
dest: /usr/lib/systemd/system/
- name: 06启动服务
systemd:
name: tomcat
enabled: true
daemon_reload: true
state: restarted
2)部署nginx
3)部署rsync
4)批量修改密码剧本
需求:定期修改更新密码
这里自己先用到了vars变量,facts变量,msg|
user模块的password选项,指定密码,指定的是加密后的密码。
password_hash(‘sha512′,’asdasf’) 密码插件用”sha512″哈希算法,加盐(随机内容,固定的)
3.2ansible变量
ans定义变量的方法 说明与特点 剧本定义 在剧本中创建与使用,仅限当前play部分(hosts部分)使用–vars 独立文件中定义(变量文件) 把变量写入到文件中,通过vars_files指定调取, play中指定变量文件位置 分组变量 推荐. 根据分组(主机清单)自动调用,剧本目录下创建group_vars/all目录,在vars.yml文件中创建变量与使用,最方便 facts变量 剧本运行的时候默认的任务,收集信息,根据信息创建的变量如果不使用,建议关闭功能,加速 register变量 类似于shell中``的功能,先执行命令,结果保留下来。变量名.stdout 变量名.rc 主机清单变量 批量修改主机名,批量修改密码(每台机器都不同),剧本调用变量
使用变量形式存放目录,用户名
调用变量,2对花括号{{}},变量在模块中选项的开头,必须加引号
vars和group_vars是核心
facts变量,register变量,var_files
1)普通变量(vars)
#添加用户,创建目录(修改所有者)
[root@m01 /server/ansible]# cat 05.file_users.yml
- hosts: all
vars:
dir: /lidao/996/
user: lidao
tasks:
- name: 1.添加用户
user:
name: "{{ user }}"
state: present
- name: 2.创建目录
file:
path: "{{ dir }}"
owner: "{{ user }}"
group: "{{ user }}"
mode: 0700
state: directory
2)分组变量(group_vars)
3)facts变量
facts变量,运行剧本的时候,默认运行收集所有节点facts变量的任务。
如果需要直接使用,主机名字,发行版本等信息。
不需要则关闭,建议全局是关闭,使用的时候再去开启(剧本hosts和tasks中间写入gather_facts: true即可)
facts变量为例, template模块配合.j2文件, 分发带有ans变量的配置文件
copy模块分发没有变量的配置文件,压缩包
[root@m01 /server/ansible]# cat /etc/ansible/ansible.cfg
#批量分发motd文件,显示指定的内容,这些就是facts变量中的部分内容
短主机名: {{ ansible_hostname }}
所有ip: {{ ansible_all_ipv4_addresses }}
内存总大小: {{ansible_memtotal_mb}}
系统发行版本: {{ansible_distribution}}
系统版本: {{ansible_distribution_major_version }}
cpu架构: {{ ansible_architecture }}
系统版本昵称: {{ ansible_distribution_release }}
第1块网卡的ip地址: {{ ansible_default_ipv4.address }}
[root@m01 /server/ansible]# vim 06.show_facts.yml
- hosts: all
gather_facts: true
tasks:
- name: 1.调试,测试输出echo
debug:
msg: |
1.主机名: {{ ansible_hostname }}
2.所有ip: {{ ansible_all_ipv4_addresses }}
3.内存总大小: {{ansible_memtotal_mb}}
4.系统发行版本: {{ansible_distribution}}
5.系统版本: {{ansible_distribution_major_version }}
6.cpu架构: {{ ansible_architecture }}
7.系统版本昵称: {{ ansible_distribution_release }}
8.第1块网卡的ip地址: {{ ansible_default_ipv4.address }}
- name: 2.分发motd文件到/etc/motd
template:
src: ./files/motd.j2
dest: /etc/motd
#使用copy模块不可以识别变量(是啥发啥),选项一样,这里需用template模块(支持变量),j2模板
4)register注册变量
类似于shell中的ip=`hostname -I`中反引号的功能
实现反引号创建变量功能,命令结果创建成了变量
使用的时候输出的是json形式的数据, 形式:变量.选择输出,常用的有:
name.stdout 正常输出,标准输出
name.rc 返回值
name.stderr 错误输出
若直接使用变量,不选择输出。是以下形式,会全输出至屏幕
ok: [172.16.1.31] => {
"msg": {
"changed": true,
"cmd": "hostname -I|awk '{print $1}'",
"delta": null,
"end": null,
"failed": false,
"msg": "Command would have run if not in check mode",
"rc": 0,
"skipped": true,
"start": null,
"stderr": "",
"stderr_lines": [],
"stdout": "",
"stdout_lines": []
}
}
[root@m01 /server/ansible]# vim 07.ip_dir.yml
- hosts: all
tasks:
- name: 1.创建ip地址变量
shell: hostname -I|awk '{print $1}'
#上一步的结果创建成了变量
register: ip_addr
- name: 1.5调试
debug:
msg: "{{ip_addr }}"
- name: 2.调用变量,创建目录
file:
path: "{{ ip_addr.stdout }}"
state: directory
5)主机清单变量-批量修改主机名
临时修改:hostname 新主机名(重启失效)
永久修改:hostnamectl set-hostname 新主机名
总结
剧本(playbook)
变量:vars,group_vars
写剧本:nginx,tomcat,rsync,nfs,lsyncd,(二进制安装的),,…..
增加模块:
lineinfile/replace
unarchive
debug