如何在智能告警平台CA触发测试告警
1059
2022-10-16
10.Python之Ansible自动化运维常用模块
Ansible工作原理:
1.管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接
2.可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
3.管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
Ansible配置文件:
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性/etc/ansible/hosts 主机清单/etc/ansible/roles/ 存放角色的目录
Ansible免密登陆:
ansible使用ssh登录,所以要在两者之间配置秘钥登录,这样才能开始正常的工作
ssh-keygen -t rsa -P "" #生成秘钥/root/.ssh/id_rsa.pubssh-copy-id -i ./.ssh/id_rsa.pub root@192.168.0.1 #将公钥传到192.168.0.1上其中192.168.0.1是要被监控的机器
实现了master与其他节点之间的连接
介绍一下Ansible命令:
功能:通过ssh实现配置管理、应用部署、任务执行等功能建议:配置ansible端能基于密钥认证的方式联系各被管理节点格式:ansible
-m MODULE_NAME, --module-name=MODULE_NAME 要执行的模块,默认为 command -a MODULE_ARGS, --args=MODULE_ARGS 模块的参数 -u REMOTE_USER, --user=REMOTE_USER ssh 连接的用户名,默认用 root,ansible.cfg 中可以配置-k, --ask-pass 提示输入 ssh 登录密码,当使用密码验证登录的时候用 -s, --sudo sudo 运行-U SUDO_USER, --sudo-user=SUDO_USER sudo 到哪个用户,默认为 root-K, --ask-sudo-pass 提示输入 sudo 密码,当不是 NOPASSWD 模式时使用-B SECONDS, --background=SECONDS run asynchronously, failing after X seconds(default=N/A)-P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using-B (default=15)-C, --check 只是测试一下会改变什么内容,不会真正去执行-c CONNECTION 连接类型(default=smart)-f FORKS, --forks=FORKS fork 多少个进程并发处理,默认 5-i INVENTORY, --inventory-file=INVENTORY 指定hosts文件路径默认 default =/etc/ansible/hosts-l SUBSET, --limit=SUBSET 指定一个 pattern,对
这里主要讲一下
ALL 表示列表中的所有主机 例:ansible all -m ping #匹配所有主机 * 支持通配符 例: ansible "*" -m ping #匹配所有主机 ansible 192.168.1.* -m ping #匹配IP地址以192.168.1开头的主机 ansible “*srvs” -m ping # 匹配分组名 以 srvs结尾的主机 逻辑或:只要存在websrvs或appsrvs组中的主机 例: ansible “websrvs:appsrvs” -m ping ansible “192.168.1.10:192.168.1.20” -m ping 逻辑与:同时在websrvs组和dbsrvs组中的主机 ansible “websrvs:&dbsrvs” -m ping 逻辑非:在websrvs组,但不在dbsrvs组中的主机 ansible ‘websrvs:!dbsrvs’ -m ping 综合逻辑:ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m -ping 正则表达式:ansible “websrvs:&dbsrvs” -m ping ansible “~(web|db).*\.magedu\.com” -m ping
Ansible执行命令过程:
加载自己的配置文件 默认/etc/ansible/ansible.cfg
加载自己对应的模块文件,如command
通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
给文件+x执行
执行并返回结果
删除临时py文件,sleep 0退出
Ansible命令工具:
ansible主程序,临时命令执行工具
ansible-doc 查看配置文档,模块功能查看工具
ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
ansible-playbook 定制自动化任务,编排剧本工具
ansible-pull 远程执行命令的工具
ansible-vault 文件加密工具
ansible-console 基于Console界面与用户交互的执行工具
Ansible常用模块:
ansible 默认提供了很多模块来供我们使用。在 Linux 中,我们可以通过 ansible-doc -l 命令查看到当前 ansible 都支持哪些模块,通过 ansible-doc -s 模块名 又可以查看该模块有哪些参数可以使用。
这里主要介绍Ansible常用模块:
ping 模块yum 模块copy 模块file 模块service 模块user 模块group模块cron 模块template 模块setup 模块fetch 模块apt 模块command 模块shell 模块script 模块
1.ping模块
检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong
ansible
2.yum 安装包模块
参数详解:
- config_file:yum的配置文件 (optional)
- disable_gpg_check:关闭gpg_check (optional)
- disablerepo:不启用某个源 (optional)
- enablerepo:启用某个源(optional)
- name:要进行操作的软件包的名字,默认最新的程序包,指明要安装的程序包,可以带上版本号,也可以传递一个url或者一个本地的rpm包的路径
- state:状态(present,absent,latest),表示是安装还卸载 present:默认的,表示为安装 lastest: 安装为最新的版本 absent:表示删除
3.copy 复制文件模块
ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh mode=600 backup=yes"如目标存在,默认覆盖,此处指定先备份 ansible srv -m copy -a "content='test content\n' dest=/tmp/f1.txt" 利用内容,直接生成目标文件
参数详解:
- update_cache: 更新缓存
- name: 要创建的文件名字
- backup: 如果原目标文件存在,则先备份目标文件
- force: 是否强制覆盖,默认为yes
- owner: 目标文件属主
- group: 目标文件属组
4.file 文件操作模块
创建新文件:ansible all -m file -a 'name=/data/f3 state=touch'删除文件:ansible all -m file -a 'name=/data/f3 state=absent'创建目录:ansible all -m file -a 'name=/data/dir1 state=directory'删除目录:ansible all -m file -a 'name=/data/dir1 state=absent'创建软连接:ansible all -m file -a 'src=/etc/fstab dest /data/fstab.link state=link'删除软连接:ansible all -m file -a 'dest /data/fstab.link state=absent'创建文件指定所有者,权限:ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link'
参数详解:
- force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
- group:定义文件/目录的属组
- mode:定义文件/目录的权限
- owner:定义文件/目录的属主
- path:必选项,定义文件/目录的路径
- recurse:递归的设置文件的属性,只对目录有效
- src:要被链接的源文件的路径,只应用于state=link的情况
- dest:被链接到的路径,只应用于state=link的情况
- state: directory:如果目录不存在,创建目录 file:即使文件不存在,也不会被创建 link:创建软链接 hard:创建硬链接 touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间 absent:删除目录、文件或者取消链接文件
5.service 管理服务模块
参数详解:
- arguments:给命令行提供一些选项
- enabled:是否开机启动 yes|no, 要求状态(state)和启用(enabled)中至少有一个。
- name:必选项,服务名称
- runlevel:运行级别
- sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
- state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
6.user 管理用户模块
添加用户,指定uid、家目录、主组及注释: ansible srv -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'添加一个系统用户: ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1' 删除用户: ansible srv -m user -a 'name=user1 state=absent' 添加一个nginx用户: ansible srv -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service" 删除nginx用户,同时删除家目录: ansible srv -m user -a 'name=nginx state=absent remove=yes'
参数详解:
- home:指定用户的家目录,需要与createhome配合使用。
- groups:指定用户的属组。
- uid:指定用的uid。
- password:指定用户的密码。注意:指定password参数时,不能使用明文密码,因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
- name:指定用户名。
- createhome:是否创建家目录 yes|no。
- system:是否为系统用户。
- remove:当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r。
- state:是创建还是删除。(present,absent)
- shell:指定用户的shell环境。
- generate_ssh_key:是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
- ssh_key_bits:可选择指定要创建的SSH密钥中的位数。
- ssh_key_passphrase:设置SSH密钥的密码。 如果没有提供密码,SSH密钥将默认没有密码。
- ssh_key_file:指定SSH密钥文件名(可选)。 如果这是一个相对的文件名,那么它将是相对于用户的主目录。
- ssh_key_type:指定要生成的SSH密钥的类型(可选)。 可用的SSH密钥类型将取决于目标主机上的实现。
7.group管理组模块
创建一个系统组: ansible srv -m group -a "name=testgroup system=yes"删除一个组: ansible srv -m group -a "name=testgroup state=absent"创建nginx组: ansible srv -m group -a 'name=nginx system=yes gid=80' 删除nginx组: ansible srv -m group -a 'name=nginx state=absent'
参数详解:
- gid:指定用的gid。
- name:指定用户名。
- state:是创建还是删除。(present,absent)
- system:如果是,则表示创建的组是系统组。
8.cron 计划任务模块
支持时间:minute,hour,day,month,weekday
创建计划任务:每周1,3,5,每分钟打印,任务名称:warningcron ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron' 注释cronname=waringcron的计划任务: ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'给cronname=waringcron的计划任务去掉注释: ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron' 创建计划任务:每五分钟同步一次服务器时间,任务名称:syntime ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" 删除计划任务:Synctime ansible srv -m cron -a 'state=absent name=Synctime'
9.template模块
基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。它的每次使用都会被ansible标记为”changed”状态。)
参数详解:
- backup: 如果原目标文件存在,则先备份目标文件
- src:在ansible控制器上的Jinja2格式化模板的路径。 这可以是相对或绝对的路径。
- dest:将模板渲染到远程机器上的位置。
- force:是否强制覆盖,默认为yes
- owner:目标文件属主
- group:目标文件属组
10.setup模块
收集指定服务器的信息,每个被管理节点在接收并运行管理命令之前,会将自己主机相关信息,如操作系统版本、IP地址等报告给远程的ansbile主机。在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下:
ansible all -m setup -a "filter=ansible_os_family"
这里给出filter常用可选项:
ansible_all_ipv4_addresses:仅显示ipv4的信息
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_major_version:显示是系统主版本
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
ansible_python_version:显示python版本
11.fetch 从客户端取文件至服务器端
ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'例: 打包 /var/log 下所有日志文件并远程抓取 ansible all -m shell -a 'tar Jcf log.tar.xz /var/log/*.log' ansible all -m fetch -a 'src=/root/log.tar.xz dest=/data'
常用参数:
- src:远程系统上要获取的文件。 这必须是一个文件,而不是一个目录。 后续版本可能会支持递归提取。
-dest:保存文件的目录。 例如,如果dest目录是/backup,在主机host.example.com上命名为/ etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。
- flat:允许您覆盖将目标文件添加到主机名/ path / to / file的默认行为。
12.apt安装包模块
# 在安装foo软件包前更新然后安装foo - apt: name=foo update_cache=yes# 移除foo软件包 - apt: name=foo state=absent# 安装foo软件包 - apt: name=foo state=present# 安装foo 1.0软件包 - apt: name=foo=1.00 state=present# 安装nginx最新的名字为squeeze-backport发布包,并且安装前执行更新 - apt: name=nginx state=latest default_release=squeeze-backports update_cache=yes# 只下载openjdk-6-jdk最新的软件包,不安装 - apt: name=openjdk-6-jdk state=latest install_recommends=no# 安装所有软件包到最新版本 - apt: upgrade=dist# 更新apt-get的list - apt: update_cache=yes# 3600秒后停止update_cache - apt: update_cache=yes cache_valid_time=3600# 安装远程节点上的/tmp/mypackage.deb软件包 - apt: deb=/tmp/mypackage.deb
参数详解:
- deb: 用于安装远程机器上的.deb后缀的软件包(optional)
- install_recommends:这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装
- update_cache: 当这个参数为yes的时候等于apt-get update(optional)
- name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
- state:状态(present,absent,latest),表示是安装还卸载 present:默认的,表示为安装 lastest: 安装为最新的版本 absent:表示删除
13.command模块
command 模块可以帮助我们在远程主机上执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a 'service vsftpd start'
注意:
使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理。
在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如 "<" , ">", "|", ";" 和 "&"这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。
如果远程节点是 windows 操作系统,则需要使用 win_command 模块
14.shell模块,和command相似,用shell执行命令
ansible srv -m shell -a 'echo magedu |passwd –stdin wang'
shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 处理。
使用 shell 模块可以在远程服务器上执行命令,它支持管道与重定向等符号
15.script模块
script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。
------------------------------------------
一些简单的playbook:
1.安装apache服务
- hosts: ubuntu sudo: yes tasks: - name: 安装apache 服务 apt: pkg=apache2 state=installed - name: 推送默认的配置 copy: src=files/awesome-app dest=/etc/apache2/sites-available/awesome-app mode=0640 - name: 创建文档根目录 file: dest=/var/www/awesome-app state=directory - name: 移除默认的虚拟主机 file: dest=/etc/apache2/sites-available/000-default.conf state=absent notify: - restart apache handlers: - name: restart apache service: name=apache2 state=restarted
运行命令:
ansible-playbook config.yml -K
2.安装nginx服务
- hosts: ubuntu #这个是你选择的主机#这个是变量 vars: work_user: www-data worker_processes: 2#sudo方式运行 sudo: yes tasks:#利用apt模块来操作 - name: ensure nginx is installed apt: pkg=nginx state=installed - name: write the nginx config file template: src=templates/nginx.j2 dest=/etc/nginx/nginx.conf#触发重启服务器 notify: - restart nginx - name: ensure nginx is running service: name=nginx state=started#这里的restart nginx 和上面的触发是配对的。这就是handlers的作用。 handlers: - name: restart nginx service: name=nginx state=restarted
3.根据操作系统判断
- hosts: ubuntu sudo: yes vars: epic: true tasks: - name: 如果是ubuntu shell: 'touch /tmp/ubuntu.txt' when: ansible_os_family == 'Debian' - name: 输出 shell: echo "aaa" > /tmp/aaa.txt when: epic - name: 安装ntp 在debian上 apt: name=ntp state=installed when: ansible_os_family == 'Debian' - name: 安装ntp 在RedHat上 yum: name=ntp state=installed when: ansible_os_family == 'RedHat'
参考链接:
发表评论
暂时没有评论,来抢沙发吧~