Python——Ansible自动化任务(ansible的介绍和部署)

一、自动化任务执行的意义

1.1 什么是自动化执行任务?

假设我们要在10台Linux服务器上安装一个Nginx服务, 手动是如何操作的?
第一步: ssh登录Linux(1,2,3...10)服务器
第二步: 输入对应服务器密码
第三步: 执行命令yum install nginx
第四步: 执行命令systemctl start nginx
第五步: 退出登录
循环执行前面的操作,直到10台服务器的Nginx服务部署完成。
解决方案:登录哪些服务器;执行哪些命令;自动化程序

1.2 自动化执行的意义
提升运维工作效率, 减少一份工作成本
提高准确度, 手工部署易出错

1.3 自动化任务执行的应用
应用一: 批量命令执行
应用二: 定时任务
应用三: 批量程序应用服务安装
应用四: 批量配置文件同步
应用五: 批量代码部署

二、 Ansible安装与基础

2.1 什么是Ansible?

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架。Ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。Ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

2.2 Ansible的特点

Ansible是Python语言实现的一套完整的自动化任务执行模块。
Ansible的play book模式, 采用yaml配置,对于自动化任务执行一目了然
部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作
默认使用SSH协议对设备进行管理
Ansible自动化场景支持丰富(大量常规运维操作模块),实现日常绝大部分操作
配置简单、功能强大、扩展性强
支持API及自定义模块,可通过Python轻松扩展
通过Playbooks来定制强大的配置、状态管理
轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可
提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台

2.3 Ansible的安装

方法一: 通过系统的方式: yum和apt-get等
方法二: 通过python的方式安装


 
   
   
   
   
  1. #通过Python安装
  2. pip3 install ansible -i https://pypi.douban.com/simple
  3. #安装完成后检验版本
  4. ansible --version

2.4 Ansible的配置文件

需要创建的配置文件有:


 
   
   
   
   
  1. mkdir /etc/ansible
  2. cd /etc/ansible
  3. touch ansible.cfg
  4. touch hosts

Python——Ansible自动化任务(ansible的介绍和部署)_第1张图片

2.4.1 Ansible配置文件位置的设置

ansible与我们其他的服务在这一点上有很大不同,Ansible的配置文件查找是从多个地方找的。


 
   
   
   
   
  1. export ANSIBLE_CONFIG= /etc/ansible/ansible.cfg
  2. env

2.4.2 Ansible配置文件

ansible 的配置文件为/etc/ansible/ansible.cfg ,ansible 有许多参数,下面我们列出一些常见的参数:


 
   
   
   
   
  1. # 资源清单inventory文件的位置
  2. inventory = /etc/ansible/hosts
  3. # 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
  4. library = /usr/share/ansible
  5. # 并发连接数,默认为5
  6. forks = 5
  7. # 设置默认执行命令的用户
  8. sudo_user = root
  9. # ssh连接的管理端口,默认为22端口,建议修改,更加安全
  10. remote_port = 22
  11. # 设置是否检查SSH主机的密钥,值为True/False。
  12. host_key_checking = False
  13. # 设置SSH连接的超时时间,单位为秒
  14. timeout = 60
  15. # 存储ansible日志的文件(默认不记录日志)
  16. log_path = /var/ log/ansible.log

2.4.3 Ansible主机清单详解

(1)简单的配置:在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是一些 ansible 需要连接管理的主机列表


 
   
   
   
   
  1. vim /etc/ansible/hosts 写入下面内容
  2. [ test] ansible要操作的对象
  3. 172.25 .254 .20 :22 ansible_ssh_user=root ansible_ssh_pass='123' 指定IP地址 用户 用户密码
  4. 192.168 .0 .20 :22 ansible_ssh_user=root ansible_ssh_pass='123'
  5. 注意上述的内容可以根据自己的需求来写。

(2)想要远程ssh连接,有三种方式:

方式一:


 
   
   
   
   
  1. # vim /etc/ansible/hosts
  2. # ssh用户名+ssh用户密码
  3. [ test]
  4. 172.25 .254 .20 ansible_ssh_user=root ansible_ssh_pass='主机密码'

方式二:密钥实现远程ssh连接

1). 生成并配置ssh公钥和私钥, 如何免密登录, 快速操作如下:


 
   
   
   
   
  1. # 生成公钥和私钥, 存储位置~/.ssh/目录下
  2. $ ssh-keygen
  3. # 将生成的公钥拷贝到需要远程登录的服务器上
  4. $ ssh-copy-id -i ~ /.ssh/id_rsa.pub root@需要登录的远程主机
  5. # 测试能否远程无密码登录
  6. ssh root@需要登录的远程主机

2). 编辑Ansible的配置文件


 
   
   
   
   
  1. # vim /etc/ansible/hosts
  2. # ssh用户名+ssh密钥
  3. [ test]
  4. 172.25 .254 .20 ansible_ssh_user=root ansible_ssh_private_key_file=密钥文件的
  5. 路径

3). 执行测试

$ ansible all -a 'date'

 
   
   
   
   

方式三:别名实现远程ssh连接


 
   
   
   
   
  1. # vim /etc/ansible/hosts
  2. # 别名+ssh用户名+ssh密钥
  3. [test]
  4. test1 ansible_ssh_host=47.92.255.98 ansible_ssh_port=22
  5. ansible_ssh_user= root ansible_ssh_private_key_file=密钥文件的路径

三、Ansible ad-hoc模式

3.1 什么是ad-hoc模式?

Ad-Hoc简而言之是“临时命令”.Ansible提供两种完成任务方式:Ad-Hoc模式,即命令集,适合解决一些简单或者平时工作中临时遇到的任务。PlayBook模式, 即Ansible-playbook剧本,适合解决复杂或需固化下来的任务。

3.2 ad-hoc模式使用场景

场景一: 在多台电脑上,查看某个进程是否启动。
场景二: 在多台机器上, 拷贝指定日志文件到本地。
场景三: 检查proxy主机组的所有主机是否存活。
场景四: 在多台机器上, 查看proxy主机组所有主机的磁盘容量。等等

3-3 ad-hoc模式的命令使用


 
   
   
   
   
  1. ansible [options]
  2. #host-pattern:用于匹配主机名或者主机组名
  3. #option: 包含执行的模块和执行的命令参数,

3-4 ad-hoc模式的常用模块

(1)主机连通性测试


 
   
   
   
   
  1. [root@client Desktop] # ansible test -m ping
  2. 192.168.0.20 | SUCCESS => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": false,
  7. "ping": "pong"
  8. }
  9. 172.25.254.20 | SUCCESS => {
  10. "ansible_facts": {
  11. "discovered_interpreter_python": "/usr/libexec/platform-python"
  12. },
  13. "changed": false,
  14. "ping": "pong"
  15. }

(2)command 模块

 这个模块可以直接在远程主机上执行命令,并将结果返回本主机。 命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如"<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持| 管道命令


 
   
   
   
   
  1. [root@client Desktop] # ansible test -m command -a 'ss -ntl'
  2. 192.168.0.20 | CHANGED | rc=0 >>
  3. State Recv-Q Send-Q Local Address:Port Peer Address:Port
  4. LISTEN 0 10 192.168.122.1:53 0.0.0.0:*
  5. LISTEN 0 10 192.168.0.20:53 0.0.0.0:*
  6. LISTEN 0 10 172.25.254.20:53 0.0.0.0:*
  7. LISTEN 0 10 127.0.0.1:53 0.0.0.0:*
  8. LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
  9. LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
  10. LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
  11. LISTEN 0 128 127.0.0.1:953 0.0.0.0:*
  12. LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
  13. LISTEN 0 10 [::1]:53 [::]:*
  14. LISTEN 0 128 [::]:22 [::]:*
  15. LISTEN 0 5 [::1]:631 [::]:*
  16. LISTEN 0 100 [::1]:25 [::]:*
  17. LISTEN 0 128 [::1]:953 [::]:*
  18. LISTEN 0 80 *:3306 *:*
  19. LISTEN 0 128 [::]:111 [::]:*
  20. LISTEN 0 128 *:80 *:*
  21. 172.25.254.20 | CHANGED | rc=0 >>

3)shell 模块

shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。


 
   
   
   
   
  1. [root@client Desktop] # ansible test -m shell -a 'cat /etc/passwd | grep "root"'
  2. 172.25.254.20 | CHANGED | rc=0 >>
  3. root:x:0:0:root:/root:/bin/bash
  4. operator:x:11:0:operator:/root:/sbin/nologin
  5. 192.168.0.20 | CHANGED | rc=0 >>
  6. root:x:0:0:root:/root:/bin/bash
  7. operator:x:11:0:operator:/root:/sbin/nologin

(4)copy 模块

这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等

① 复制文件:


 
   
   
   
   
  1. [root@client Desktop] # ansible test -m copy -a 'src=/etc/passwd dest=/mnt'
  2. 172.25.254.20 | CHANGED => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": true,
  7. "checksum": "33929b98cf1d165467b5b62be3b7ac813d5b65d2",
  8. "dest": "/mnt/passwd",
  9. "gid": 0,
  10. "group": "root",
  11. "md5sum": "6fc5949596db5741544ae8b47759eacd",
  12. "mode": "0644",
  13. "owner": "root",
  14. "secontext": "unconfined_u:object_r:mnt_t:s0",
  15. "size": 2807,
  16. "src": "/root/.ansible/tmp/ansible-tmp-1596274212.7856452-9940-123839584318193/source",
  17. "state": "file",
  18. "uid": 0
  19. }

② 给定内容生成文件,并制定权限


 
   
   
   
   
  1. [root@client Desktop] # ansible test -m copy -a 'content="hello world" dest=/mnt/file22 mode=666'
  2. 172.25.254.20 | CHANGED => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": true,
  7. "checksum": "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed",
  8. "dest": "/mnt/file22",
  9. "gid": 0,
  10. "group": "root",
  11. "md5sum": "5eb63bbbe01eeed093cb22bb8f5acdc3",
  12. "mode": "0666",
  13. "owner": "root",
  14. "secontext": "system_u:object_r:mnt_t:s0",
  15. "size": 11,
  16. "src": "/root/.ansible/tmp/ansible-tmp-1596274341.1756465-10845-58400519655201/source",
  17. "state": "file",
  18. "uid": 0
  19. }

5)yum 模块

 顾名思义,该模块主要用于软件的安装。

[root@server ~]# ansible test -m yum -a 'name=httpd state=present'
 
   
   
   
   

(6)service 模块

该模块用于服务程序的管理

① 开启服务并设置自启动

[root@server ~]# ansible web -m service -a 'name=nginx state=started enabled=true' 
 
   
   
   
   

② 关闭服务

[root@server ~]# ansible web -m service -a 'name=nginx state=stopped'
 
   
   
   
   

(6)需求

需求1: 主机连通性测试(ping模块)
需求2: 查看主机root用户的详细信息(shell模块)
需求3: 备份主机的日志文件/var/log/messages到/mnt/目录(copy模块)
需求4: 给定文件内容"hello ansible"生成文件/mnt/ansible,并指定权限为666(copy模块)
需求5: 主机批量安装软件gcc和nginx(yum模块)
需求6: 启动nginx服务(service模块)和判断nginx的80端口是否打开(shell模块-ss -ntl)
需求7: 主机新建uid=8888的用户user1
需求8: 拉取Github项目项目到主机并部署(git模块)
需求9:搜集主机信息并筛选与内存Memory相关的信息(setup模块)

你可能感兴趣的:(django,python,linux,运维)