- 根底篇与进阶篇次要是为了基于
AnsibleAPI
二次开发 工作核心 做垫铺,并非官网应用文档,可能会有所脱漏,如有不足之处,欢送拍砖斧正,谢谢。- 基于
AnsibleAPI
二次开发工作核心曾经开发实现,并且曾经投入生产应用,后续会把具体的设计思路与具体架构分享给大家,敬请期待。- 为了不便大部分同学更好的理解 Ansible 的高级性能与个性,仅以此篇文章指引大家循序渐进的零碎学习 Ansible,将 Ansible 的高级性能以及个性施展到酣畅淋漓。
ansible 简介:
Anasible 是基于 Python2-Paramiko 模块开发的自动化保护工具,实现了批量系统配置、部署、运行等性能。Ansible 是基于模块工作的,自身不具备批量部署的性能,如果想要实现批量自动化部署,是 Ansible 本身的各种模块的汇合。
能够与 Ansible 同台竞技的运维工具(pupet、cfengine、chef、func、fabric、saltstack)
-
Ansible 发展史
- ansible 作者:
Michael DeHaan
同时他也是Cobbler 与 Func
作者。 - 2012-03-09 公布 0.0.1 版本。
- 2015-10-17 被
Red Hat
收买。 - GitHub
- ansible 作者:
-
ansible 个性
- Python 开发
- 模块化: 调用特定的模块(如: Paramiko、PyYAML、jinja2 等), 实现特定的工作。
- 自定义模块
- 简略部署
- 反对编排工作(PlayBook)
- 冥等性: 工作反复执行等于只执行一次, 不会反复执行屡次雷同命令。
- 反对多语言编写模块
- YAML 格局编排工作, 反对丰盛的数据结构.
Ansible 架构与执行流程
ansible
次要组成部分:
- Users: 治理 Ansible Playbook 和 Ansible 引擎。
- Ansible playbook: Ansible 引擎和 CMDB 做交互。
- Public or Private cloud: 便于所有模块 和 API 以及云的交互。
- Inventory: Ansible 执行主机的列表清单,默认读取配置为 /etc/ansible/hosts。
- API: 提供端到端交互的 API 接口。
- Modules: Ansible 执行命令的功能模块, 个别为 Ansible 内置模块, 也能够自定义第三方模块。
- Plugins: 用于补充模块的性能,能够自行编写插件。
Ansible 装置
# Centos
yum -y install ansible
# Ubuntu
apt install -y ansible
# 源码装置
git clone https://github.com/ansible/ansible
# 应用 pip 命令装置
pip install ansible
Ansible 配置阐明:
/etc/ansible/ansible.cfg
主配置文件, 配置 ansible
的工作个性.
/etc/ansible/hosts
主机列表清单.
/etc/ansible/roles/
寄存 (roles) 角色的目录.
/usr/local/bin/ansible
二进制执行文件, ansible
主程序.
/usr/local/bin/ansilbe-doc
配置文档, 模块性能查看工具.
/usr/local/bin/ansible-galaxy
用于上传 / 下载 roles
模块到官网平台的工具.
/usr/local/bin/ansible-playbook
自动化工作、编排剧本工具/usr/bin/ansible-pull
近程执行命令的工具.
/usr/local/bin/ansible-vault
文件(如: playbook 文件) 加密工具.
/usr/local/bin/ansible-console
基于 界面的用户交互执行工具.
/etc/ansible/hosts
创立 SSH 秘钥
ssh-keygen -t rsa -C "deniss.wang"
拷贝公钥到其余被服务器
ssh-copy-id -i ubuntu@ubuntu20-bj01
hosts
[codo-cluster]
demo.opendevops.cn ansible_ssh_user=root
www.opendevops.cn ansible_ssh_user=root
[k3s-cluster]
ubuntu20-bj01 ansible_user=ubuntu
ubuntu20-bj02 ansible_user=ubuntu
ubuntu20-bj03 ansible_user=ubuntu
ubuntu20-sh04 ansible_user=ubuntu
-m
指定模块执行。如:ping、yum、copy、file 等,此处应用模块 ping 测试。
-k
应用明码形式,默认是应用 SSH-KEY 登录。
根本示例:
# ansible 通过 单主机进行操作 (-k 为用户明码形式, 默认为 ssh-key)
ansible 10.0.8.2 -m ping -k
# ansible 通过 ':' 组合进行操作
ansible "10.0.8.2:10.0.8.3" -m ping -k
# ansible 通过 通配符加主机 进行操作
ansible 10.0.8.* -m ping -k
# ansible 通过 hosts 组名称 进行操作
ansible codo -m ping -k
# ansible 通过 ':' 组合组进行操作
ansible 'codo-cluster:k3s-cluster' -m ping -k
# ansible 通过 通配符 进行操作
ansible '*-cluster' -m ping -k
# ansible 通过 ':&' 逻辑与 (两个组中都蕴含的主机)
ansible 'codo-cluster:&k3s-cluster' -m ping -k
# ansible 通过 ':!' 逻辑非 (codo-cluster 但不在 k3s-cluster 的主机)
ansible 'codo-cluster:!k3s-cluster' -m ping -k
# ansible 也反对多逻辑的组合
ansible 'webservers:dbserver:&appserver:!ftpservers' -m ping -k
# ansible 也反对正则表达式
ansible '~(codo|k3s)-cluster' -m ping -k
# ansible 通过 all 对 hosts 清单下所有主机进行操作
ansible all -m ping -k
# ansible 通过 通配符 对 hosts 清单下所有主机进行操作
ansible '*' -m ping -k
执行后果:
# ansible k3s -m 'ping'
ubuntu20-bj03 | SUCCESS => {
"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},
"changed": false,
"ping": "pong"
}
ubuntu20-bj02 | SUCCESS => {
"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},
"changed": false,
"ping": "pong"
}
ubuntu20-bj01 | SUCCESS => {
"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},
"changed": false,
"ping": "pong"
}
ubuntu20-sh04 | SUCCESS => {
"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"},
"changed": false,
"ping": "pong"
}
/etc/ansible/ansible.cfg
# defaults 为默认配置
[defaults]
# 主机清单的门路, 默认为如下
# inventory = /etc/ansible/hosts
# 模块寄存的门路
# library = /usr/share/my_modules/
# utils 模块寄存门路
# module_utils = /usr/share/my_module_utils/
# 近程主机脚本长期寄存目录
# remote_tmp = ~/.ansible/tmp
# 治理节点脚本长期寄存目录
# local_tmp = ~/.ansible/tmp
# 插件的配置文件门路
# plugin_filters_cfg = /etc/ansible/plugin_filters.yml
# 执行并发数
# forks = 5
# 异步工作查问距离 单位秒
# poll_interval = 15
# sudo 指定用户
# sudo_user = root
# 运行 ansible 是否提醒输出 sudo 明码
# ask_sudo_pass = True
# 运行 ansible 是否提醒输出明码 同 -k
# ask_pass = True
# 近程传输模式
# transport = smart
# SSH 默认端口
# remote_port = 22
# 模块运行默认语言环境
# module_lang = C
# roles 寄存门路
# roles_path = /etc/ansible/roles
# 不查看 /root/.ssh/known_hosts 文件 倡议勾销
# host_key_checking = False
# ansible 操作日志门路 倡议关上
# log_path = /var/log/ansible.log
ansible 执行过程
- load 配置文件 /etc/ansible/ansible.cfg
- Load 模块配置文件
- 通过 Ansible 将调用的模块或 PlayBook 生成对应的长期 py 文件, 并将该临时文件传输至近程服务器的对的执行用户目录下
$HOME/.ansible/tmp/ansible-tmp-2123/xxxxxxx.py
> 文件. - 对生成的文件增加可执行权限.
- 执行生成文件,并返回对应的后果.
-
删除生成文件,退出.
执行返回状态:
- 绿色:执行胜利,无更改操作。如 ping 模块
- 黄色:执行胜利,更新过主机的操作。如执行 shell 模块执行 ifconfig 命令。
- 红色:执行失败返回后果。如 FAILED、UNREACHABLE 状态。
Ansible-Doc
显示帮忙信息
应用参数:
-l --list
显示可用模块
-s --snippet
显示指定模块的 playbook
阶段
Demo
# Demo
ansible-doc -l
# ... 略过
ansible-doc ping
# 模块 ping 显示文档
ansible-doc -s ping
Ansible
ansible <host-pattern> [-m module_name] [-a args]
host-pattern
: 主机 ip、主机名、主机组。module_name
: 模块的名称。默认为-m command
。args
: 模块的参数, 须要加上-a
进行指定模块的参数。如: `ansible all -a‘hostname’-v、-vv、-vvv
: 显示具体的命令输入日志, v 越多越具体。如:ansible all -m ping -vvv
--list
: 显示主机的列表。如:ansible all --list
-k / --ask-pass
: 提醒输出 ssh 连贯明码, 默认为 ssh-key 认证。如:ansible all -m ping -k
-K / --ask-become-pass
: 提醒输出 sudo 的明码。-C / --check
: 查看命令操作, 并不会执行。如:ansible all -m ping -C
-T / --timeout
: 执行命令的超时工夫, 默认为 10s。如:ansible all -m ping -T=2
-u / --user
: 执行近程操作的用户. 如:ansible all -m ping -u=root
-b / --become
: 代替旧版的sudo
切换。
ansible 罕用模块
截止 2021-10-12 ansible 模块为 6006 个. 不堪称不弱小!人生苦短,我用 Python!
command 模块
在近程主机上执行命令, 反对条件判断. ansible 默认模块, 可疏忽 -m
参数间接操作.
留神: command
模块 不反对 $VARNAME
<
>
|
;
&
等符号.
Demo
# 进行 docker 服务
ansible k3s-cluster -m command -a 'systemctl stop docker'
# 查看所有 docker 镜像
ansible k3s-cluster -a 'docker ps -a'
# 如果 /opt/ansible 不存在 就不执行 df -h 操作, 如果 /opt/ansible 存在, 就执行 df -h 操作.
ansible k3s-cluster -a 'removes=/mnt/ansible df -h'
# 如果 /opt/ansible 不存在 就执行 df -h 操作, 如果存在 /opt/ansible 就不执行 df -h 操作.
ansible k3s-cluster -a 'creates=/mnt/ansible df -h'
# 切换目录, 等同于 cd /mtn && ls -lt 操作
ansible k3s-cluster -a 'chdir=/mnt ls -lt'
shell 模块
shell
模块: shell 模块反对 command 所有的操作, 而且反对 $VARNAME
<
>
|
;
&
等符号操作.
Demo:
# 查看 docker 过程
ansible k3s-cluster -m shell -a 'ps -ef|grep docker'
scripts 模块
script
模块: 执行脚本. 只须要调用 ansible 的宿主机寄存的脚本文件就能够在抉择主机下面执行脚本.
Demo
# shell
cat /tmp/deniss.sh
#!/bin/bash
echo "测试 shell"
ansible k3s-cluster -m script -a '/tmp/deniss.sh'
# python
cat /tmp/deniss.py
#!/usr/bin/python
import sys
print ('Deniss_Wang')
print (sys.version)
ansible k3s-cluster -m script -a '/tmp/deniss.py'
# 其余脚本也是能够的,只须要配置好环境语言解释即可。
copy 模块
copy
模块: 复制 ansible 宿主机文件到指标主机.
Demo
# src=""宿主机门路 dest="" 指标主机门路 backup=yes 如果指标主机文件存在, 会备份, 再笼罩.
ansible k3s-cluster -m copy -a‘src=/tmp/deniss.py dest=/tmp/deniss.py backup=yes
# mode=""批改权限,owner="" 批改用户,group="" 批改用户组
ansible k3s-cluster -m copy -a 'src=/root/deniss.py dest=/root/deniss.py mode=0644 owner=deniss group=deniss'
# content="" 将内容写入到指标文件中
ansible k3s-cluster -m copy -a 'content="hello\nworld\n"dest=/tmp/deniss.txt'
Fetch 模块
fetch
模块: 将指标近程主机的文件, 下载到本地, 下载胜利会寄存在以 IP/NAME 的目录中, 蕴含原文件的整体门路.
留神:只能下载单个文件, 不反对目录, 想下载残缺门路,能够压缩后在下载。
Demo
# src=""指标近程主机的文件门路 dest="" 本地目录
ansible k3s-cluster -m fetch -a 'src=/var/log/syslog dest=/tmp/'
file 模块
file
模块: 操作远程目标主机的文件. 如: touch
、absent
等.
Demo
# mode=""批改权限 owner="" 批改用户 group="" 批改用户组 recurse=yes 递归受权
ansible k3s-cluster -m file -a 'name=/tmp/deniss.txt owner=ubuntu group=ubuntu mode=0755 recurse=yes'
# dest、name、path: 指定近程主机的文件门路,state: 文件操作类型, 默认为 absent,touch: 创立空文件.
ansible k3s-cluster -m file -a 'name=/tmp/deniss.txt state=touch'
# directory: 创立文件夹,absent: 递归删除文件夹 / 文件,link: 创立软连贯.
ansible k3s-cluster -m file -a 'src=/tmp/deniss.txt dest=/tmp/deniss.link state=link'
Cron 模块
cron
模块: 为近程主机增加定时工作
day
: 示意 天. 反对 (1-31, , /2 ) 写法hour
: 示意 小时. 反对 (0-23, , /2 ) 写法minute
: 示意 分钟. 反对 (0-59, , /2 ) 写法month
: 示意 月. 反对 (1-12, , /2 ) 写法weekday
: 示意 星期. 反对 (0-6, Sunday-Saturday, *)写法job
: 示意 打算工作的内容.name
: 示意 打算工作名称. 雷同的打算工作名称会笼罩.
Demo
# day: 示意 天. 反对 (1-31, *, */2) 写法
# hour: 示意 小时. 反对 (0-23, *, */2) 写法
# minute: 示意 分钟. 反对 (0-59, *, */2) 写法
# month: 示意 月. 反对 (1-12, *, */2) 写法
# weekday: 示意 星期. 反对 (0-6, Sunday-Saturday, *)写法
# job: 示意 打算工作的内容.
# name: 示意 打算工作名称. 雷同的打算工作名称会笼罩.
ansible k3s-cluster -m cron -a 'weekday=1-5 job="echodate>> /tmp/1.txt"name=echocron'
# disabled= (true/false、yes/no)正文掉打算工作 敞开、启动打算工作 必须指定 job 和 name.
ansible k3s-cluster -m cron -a 'disabled=true job="echodate>> /root/1.txt"name=echocron'
# state=absent 删除打算工作。ansible k3s-cluster -m cron -a 'name=echocron state=absent'
Yum 模块
yum
模块: 利用 yum 操作软件包, 如 装置、查问、卸载等.
Demo
# name: 软件包的名称, 或者 rpm 包, 近程服务器必须存在 rpm 包. 装置多个软件应用 , 号隔开. 如 name=nginx,php,mysql
# state="present/installed/absent/removed"
# present、installed: 装置软件.
# absent、removed: 卸载 / 删除软件.
# update_cache=yes: 更新 yum 缓存后 在装置软件 disable_gpg_check=yes: 禁用 gpg 查看.
ansible k3s-cluster -m yum -a 'name=mysql state=present'
ansible k3s-cluster -m yum -a 'name=/tmp/nginx-xx.x.x-x.x.x86_64.rpm'
ansible k3s-cluster -m yum -a 'name=nginx update_cache=yes disable_gpg_check=yes'
# list="updates/installed/available/repos" 指定获取状态
# 状态释义: installed: 已装置的软件 updates: 能够降级的软件 available: 能够装置的软件 repos: yum 源
ansible k3s-cluster -m yum -a 'list=installed'
Service 模块
service
: 软件服务治理模块. 启动、敞开、重启 等操作.
# name="",装置名字
# state="started/stopped/restarted/reloaded" 启动、进行、重启、重载
# enable="yes/no、true/false" 设置是否开机自启
ansible k3s-cluster -m service -a 'name=nginx state=started enabled=yes'
User 模块
user
: 管理系统用户的模块
Demo
# name"" 用户名
# shell="" 指定用户的 shell 类型
# system="yes/no" 指定是否为 零碎用户
# home="" 指定用户额定的 home 目录, 默认 /home/user .
# groups="" 用户额定的 groups 组.
# uid="" 指定用户的 UID.
# comment="" 用户形容
ansible k3s-cluster -m user -a 'name=deniss shell=/sbin/nologin system=yes home=/tmp/deniss groups=root uid=777 comment="deniss user"'# state="present/absent"
# present: 创立用户 (默认为 present) absent: 删除用户
ansible k3s-cluster -m user -a 'name=deniss state=absent remove=yes'
ansible k3s-cluster -m user -a 'name=nginx state=absent remove=yes'
Group 模块
group
: 管理系统用户组的模块.
Demo
# name"" 用户名
# system="yes/no" 指定是否为 零碎用户
# home="" 指定用户额定的 home 目录, 默认 /home/user .
# gid="" 指定 GID.
# state="present/absent"
# present: 创立用户组 (默认为 present) absent: 删除用户组
# 创立
ansible all -m group -a 'name=deniss system=yes gid=777'
# 删除
ansible all -m group -a 'name=deniss state=absent'
ansible-galaxy
官网 https://galaxy.ansible.com/
ansible-galaxy 工具用于下载对应的roles
# list 查看本地的 roles 角色。ansible-galaxy list geerlingguy.nginx
# install 下载 roles 角色寄存到 $HOME/.ansible/roles/ 目录下。ansible-galaxy install geerlingguy.nginx
# remove 删除已下载的 roles 角色,也能够在寄存目录总删除。ansible-galaxy remove geerlingguy.nginx
附上几张曾经开发实现的工作核心截图,欢送拍砖!
在基于 DevOps 思维对自动化运维改革的小道上,始终砥砺前行,从未停歇。
道阻且长,行则将至,行而不辍,将来可期。
欢送搜寻 k8stech
关注公众号,定时更新运维开发、SRE、云原生等文章。