ansible 学习笔记
ansible 基于ssh
主要组成部分
安装
yum安装需要先安装epel源:yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
相关文件
配置文件说明
cat /etc/ansible/ansible.cfg
简单命令
1、ansible-doc 显示模块帮助
参数:-a 显示所有的模块
-l 列出可用模块
比如:查看ping命令如何使用:ansible-doc ping
2、ansible
格式:ansible 主机(主机/分组/清单+通配符/清单+逻辑与或非/清单+正则表达式) -m 模块 -a 参数
注意:使用ansible命令前,一般的都会先进行主机直接得K验证,方便测试验证:https://www.cnblogs.com/leihongnu/p/16718372.html
1)查看web分组的主机:ansible web --list
2)查看192.168.59.103主机的/root目录下的内容: ansible 192.168.59.103 -m command -a 'ls /root'
默认是:-m command ,所以也可以不写: ansible 192.168.59.103 -a 'ls /root'
3)创建给192.168.59.103主机创建目录: ansible 192.168.59.103 -a 'mkdir /data'
注意:创建目录有专门的模块,上面的命令也可以创建
4)创建给192.168.59.10*主机创建用户user1: ansible 192.168.59.10* -a 'useradd user1'
注意:192.168.59.10*,的通配符*号
5)给用户设置密码: ansible 192.168.59.103 -m shell -a 'echo 123456|passwd --stdin user1'
注意:-m command 模块不支持”|“管道符,需要用到shell模块
6)命令的执行过程
常用模块
1、command 远程主机上执行命令,默认模块,可不写-m command
此命令不支持:$hostname,< ,>, |,& 等特殊符号,如果要使用需要用shell模块
ansible 192.168.59.10* -a 'useradd user1'
2、shell 与command基本相同,使用shell执行命令执行比command更复杂的命令,但也只能处理比较复杂一点的
ansible 192.168.59.103 -m shell -a 'echo 123456|passwd --stdin user1'
3、script 执行脚本
用于被控端主机上执行 ansible端上的脚本,注意:脚本是放在ansible端的
ansible 192.168.59.103 -m script -a 脚本.sh
4、copy ansible端复制文件到被控端
src 源文件
dest 目的地文件
backup 备份,将目的主机上的文件备份为:文件名+时间
owner 指定目的地文件所有人
group 所有组
mode 指定目的地文件权限
将/root/1.txt文件复制到192.168.59.103下/root/1.txt,并且备份
ansible 192.168.59.103 -m copy -a 'src=/root/1.txt dest=/root/1.txt backup=yes'
5、fetch 复制抓取文件到ansible本机,与copy相反
常用参数:
src 受控主机源文件,单个文件,不能是目录
dest 本机目录,默认抓取到ansible主机上的/被控端
flat 基本名称功能
ansible 192.168.59.103 -m fetch -a 'src=/root/1.log dest=./'
复制192.168.59.103下的/root/1.log到ansible主机的当前目录
6、file文件属性设置
常用参数:
path 指定文件名称,和参数name同样
state 指定操作的状态 /touch创建文件/absent删除文件或目录/directory创建目录/link创建软连接/hard创建硬连接
owner 设定文件用户
group 设定文件组
src 源文件
dest 目标文件
recurse 递归更改
ansible 192.168.59.103 -m file -a 'src=/root/a.txt name=/root/a state=link' #软连接和硬连接需要指定src
ansible 192.168.59.103 -m file -a 'path=/data/ansible/test/1.txt state=touch'
注意:/data/ansible/test/目录必须存在,否则创建失败
7、archive压缩
常用参数:
path 打包目录名称
dest 打包文件明称
formatansible westos -m archive -a 'path=/etc dest=/opt/etc.tar.bz2 format=bz2 owner=westos mode=666' 打包格式
owner 指定文件所有人
mode 指定文件权限
打包被控端192.168.59.103 下/var/log/httpd 的文件到/root/logs.tar.gz
ansible 192.168.59.103 -m archive -a 'path=/var/log/httpd dest=/root/logs.tar.gz format=gz'
8、unarchive 解压缩
常用参数:
copy no从受控主机找源文件src yes默认,从ansible主机复制文件到受控主机
remote_src 与copy相反 yes包在受控主机 no 在ansible主机
src 文件或者包路径
dest 受控主机目录
mode 指定文件权限
ansible 192.168.59.103 -m unarchive -a' src=/data/nginx/nginx-1.22.0.tar.gz dest=/data/nginx copy=no'
9、hostname 修改主机名
ansible 192.168.59.103 -m hostname -a 'name=103'
立即生效,但是/etc/host没有修改
10、cron 计划任务
常用参数:
minute/hour/day/month/weeekday 时间
name 名称,建议写上,不写也可以
job 任务
disabled yes/no/true/false 禁用计划/启动计划
state absent删除计划
ansible 192.168.59.103 -m cron -a 'job="mkdir /data/103" minute=07 hour=15 name=10301'
每天15:07创建一次目录
ansible 192.168.59.103 -m cron -a 'job="/usr/bin/wall FBI" minute=* hour=17 name=10303' 每天17点开始广播FBI
ansible 192.168.59.103 -m cron -a 'state=absent name=0302' 删除10302任务
ansible 192.168.59.103 -m cron -a 'job="mkdir /data/103" disabled=true name=10302' 禁用10302任务
11、yum
常用参数:
name 指定仓库名称
baseul 指定源路经
description 指定仓库描述
file 指定仓库文件名称
enabled 仓库是否启用
gpgcheck 仓库是否检测gpgkey
state present/absent 建立(默认)/删除
ansible 192.168.59.103 -m yum -a 'name=tree' 安装tree(192.168.59.103可以使用yum安装的情况)
ansible 192.168.59.103 -m yum -a 'name=tree,net-tools' 安装tree和net-tools,用逗号隔开(192.168.59.103可以使用yum安装的情况)
ansible 192.168.59.103 -m yum -a 'name=/root/tree.rpm' 安装单个tree.rpm包,需要先上传rpm到被控端
12、service 服务
ansible 192.168.59.103 -m service -a 'name=httpd state=started'
启动httpd服务,注意:httpd必须可以使用service/systemctl命令启动
enabled=yes/no 开机启动/不启动
13、firewalld 防火墙
常用参数:
zone 火墙的域
service 服务名称
permanent 永久生效
state= enabled/disabled 允许/拒绝
immediate 立即生效
ansible 192.168.59.103 -m firewalld -a 'service=http state=enabled permanent=yes immediate=yes' 开启服务http
ansible 192.168.59.103 -m firewalld -a 'port=80/tcp state=enabled permanent=yes immediate=yes' 开启防火墙端口80/tcp
14、user 用户
常用参数:
name 必须参数 uid 指定用户的uid
group/groups 组与附加组 comment 指定用户的注释信息
append 指定添加附加组默认值no state absent/present
shell 指定用户默认shell password generate_ssh_key=yes
home 指定家目录
ansible 192.168.59.103 -m user -a 'name=httpd shell=/sbin/nologin' 创建用户httpd,shell类型不可登录
15、group 用户组
常用参数:
name 组名
state absent/present
gid 组id
ansible 192.168.59.103 -m group -a 'name=test '
ansible-galaxy 系列
官网地址:https://galaxy.ansible.com/,roles的共享网站,可以下载共享的roles到/etc/ansible/role目录下
ansible-galaxy install geerlingguy.nginx 下载nginx role
查看roles列表
ansible-galaxy list
复制roles,直接复制下载好的文件目录就可以
cp /root/.ansible/roles/geerlingguy.nginx /root/.ansible/roles/leihongnu.nginx -rp
删除roles,直接删除目录或者remove就可以
ansible-galaxy remove geerlingguy.nginx
ansible-vault 加密系列
管理加密解密yml文件
加密文件: ansible-vault encrpty hello.yml,加密之后执行需要解密
yaml语法
playbook
核心元素
例子
ansible-playbook 剧本.yml
ansible-playbook -C 剧本.yml:检查,不执行
第一个的playbook
注意:yml语法的格式,注意缩进(空格)
vim hello.yml
【
#一般第一行用 --- 不写也可以
---
#针对那些主机操作
- hosts: s103
#使用什么用户进行操作
remote_user: root
#任务
tasks:
#任务说明/描述
- name: hello
#模块
command: /usr/bin/wall hello
】
第二个playbook,安装docker-redis
vim redis.yml
【
#第一行给 ---
---
#主机
- hosts: 192.168.59.103
#用户
remote_user: root
任务
tasks:
#任务描述,启动docker.service服务
- name: start docker.service
command: systemctl start docker
#任务描述:创建文件目录,用来做容器映射,也可以用file模块
- name: mkdir dir
shell: mkdir -p /data/redis/{conf,db}
#拷贝ansible端的redis.conf文件到被控端
- name: coyp conf
copy: src=/root/redis.conf dest=/data/redis/conf
#启动容器
- name: run redis
shell: docker run -p 6379:6379 -v /data/redis/conf:/usr/local/etc/redis -v /data/redis/data:/data --name redis redis redis-server /usr/local/etc/redis/redis.conf --requirepass "123456"
】
handle和notify
例如
【
---
- host: 192.168.59.103
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
-name:copy conf
coyp: src=httpd.conf dest=/etc/httpd/
#如果httpd.conf有修改/不一致,触发handle下的haha
notify:haha
- name: start httpd
service: name=httpd state=started
habdle:
- name: haha
service: name=httpd state=restarted
】
tags 标签
例如
【
---
- host: 192.168.59.103
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
-name:copy conf
coyp: src=httpd.conf dest=/etc/httpd/
#如果httpd.conf有修改/不一致,触发handle下的haha
notify:haha
tags:lala
- name: start httpd
service: name=httpd state=started
tags:heihei
habdle:
- name: haha
service: name=httpd state=restarted
】
在剧本中设置了tag,在执行 的时候可以指定执行,如下:
ansible-playbook -t heihei 剧本.yml 只执行剧本中的嘿嘿标下的任务
也可以多个动作使用一个tags名,多个tags执行用逗号
变量
变量的优先级:
命令行指定(-e)>/etc/ansible/hosts下的第一主机变量>/etc/ansible/hosts下的主机组变量
第2种方式,
例如:
第3种方式,剧本中用{{ }}调用变量,在执行是使用 -e 指定/声明变量:
第4种方式,在剧本中声明变量,剧本中用{{ }}调用变量
简单使用
1、配置主机清单
分组为:web
注意:默认情况下ssh的端口号是22,如果ssh的默认端口不是22,需要加上端口号。
如ssh的端口是是1022,清单上的ip必须为:192.168.59.103:1022
2、验证主机是否添加成功
ansible 192.168.59.103 -m ping 没有K验证的话需要手动输入密码,如下:
ansible 192.168.59.103 -m ping -k
或者用分组的方式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了