自动化运维与python项目实战:Ansible自动化任务

目录

自动化任务执行的意义

1.什么是自动化执行任务?

2. 自动化执行的意义

3. 自动化任务执行的应用

Ansible安装与基础

1. 什么是Ansible?

2. Ansible的特点

3. Ansible的安装

4. Ansible的配置文件

4.1 Ansible配置文件位置的设置

4.2 Ansible配置文件

4.3  Ansible主机清单配置详解

Ansible ad-hoc模式

1. 什么是ad-hoc模式?

2. ad-hoc模式使用场景

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

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

Ansible Playbook模式

1.什么是Playbook及其组成

2.Playbook的配置语法

3.playbook的第一个应用案例


自动化任务执行的意义

1.什么是自动化执行任务?

假设我们要在10台Linux服务器上安装一个Nginx服务, 手动是如何操作的?

  • 第一步: ssh登录Linux(1,2,3...10)服务器
  • 第二步: 输入对应服务器密码
  • 第三步: 执行命令yum install nginx
  • 第四步: 执行命令systemctl start nginx
  • 第五步: 退出登录
  • 循环执行前面的操作,直到10台服务器的Nginx服务部署完成。

解决方案:

登录哪些服务器;执行哪些命令;自动化程序

 

2. 自动化执行的意义

提升运维工作效率, 减少一份工作成本
提高准确度, 手工部署易出错

 

3. 自动化任务执行的应用

 

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

 

Ansible安装与基础

1. 什么是Ansible?

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

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

 

2. Ansible的特点

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

 

3. Ansible的安装

  • 方法一: 通过系统的方式: yum和apt-get等
  • 方法二: 通过python的方式安装
#通过Python安装
pip3 install ansible -i https://pypi.douban.com/simple
 
#安装完成后检验版本
ansible --version

自动化运维与python项目实战:Ansible自动化任务_第1张图片

 

4. Ansible的配置文件

需要创建的配置文件有:

mkdir /etc/ansible
cd /etc/ansible
touch ansible.cfg
touch hosts

自动化运维与python项目实战:Ansible自动化任务_第2张图片

 

4.1 Ansible配置文件位置的设置

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

  • 检查环境变量ANSIBLE_CONFIG指向的路径文件
export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg
  • ./ansible.cfg, 检查当前ansible命令所在目录下的ansible.cfg配置文件
  • ~/ansible.cfg,检查当前用户家目录下的ansible.cfg配置文件
  • /etc/ansible/ansible.cfg,如果前面都没有指定,默认指定的配置文件路径

 

4.2 Ansible配置文件

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

[defaults]
# 资源清单inventory文件的位置
inventory = /etc/ansible/hosts
# 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
library = /usr/share/ansible
# 设置默认执行命令的用户`
sudo_user = root
#不检测要连接的主机是否在known_hosts用户中
host_key_checking=False

# ssh连接的管理端口,默认为22端口,建议修改,更加安全
remote_port = 22

# 存储ansible日志的文件(默认不记录日志)
log_path = /var/log/ansible.log

[ssh_connection]
ssh_args = -o StrictHostKeyChecking=no

 

4.3  Ansible主机清单配置详解

在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是一些 ansible 需要连接管理的主机列表。我们可以来看看他的定义方式:

# 方法一: 直接指明主机地址或主机名
ansible1.example.com
192.168.100.1

# 方法二: 定义一个主机组[组名]把地址或主机名加进去.
# 注意: 组成员可用通配符来匹配
[mysql_test]
ansible1.example.com
ansible2.example.com
192.168.100.1
192.168.100.2

在Ansible配置文件中,简单介绍了主机清单的配置,可实现对主机的分组。那么如果想要对指定主机 实现远程ssh连接并批量执行命令,该如何操作呢? 想要远程ssh连接,有三种方式:

方法1:密码实现远程ssh连接

vim /etc/ansible/hosts  写入下面内容
[test]  ansible要操作的对象
172.25.254.10:22 ansible_ssh_user=root ansible_ssh_pass='123'  指定IP地址 用户 用户密码
172.25.254.20:22 ansible_ssh_user=root ansible_ssh_pass='123'
 
 注意上述的内容可以根据自己的需求来写。

方法2:密钥实现远程ssh连接

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

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

2)  编辑Ansible的配置文件

# vim /etc/ansible/hosts
# ssh用户名+ssh密钥
[test]
172.25.254.10:22 ansible_ssh_user=root ansible_ssh_private_key_file=密钥文件的路径

3)  执行测试

ansible all -a 'date'

 

Ansible ad-hoc模式

1. 什么是ad-hoc模式?

  • Ad-Hoc简而言之是“临时命令”.

Ansible提供两种完成任务方式:

  • Ad-Hoc模式,即命令集,适合解决一些简单或者平时工作中临时遇到的任务。
  • PlayBook模式, 即Ansible-playbook剧本,适合解决复杂或需固化下来的任务。

 

2. ad-hoc模式使用场景

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

 

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

Ad-Hoc命令集由/usr/bin/ansible实现,其命令用法如下:

ansible  [options]
  • host-pattern:用于匹配主机名或者主机组名
ansible 192.168.1.* -a 'hostname'
ansible group1 -a 'hostname'
ansible test1 -a 'hostname'

自动化运维与python项目实战:Ansible自动化任务_第3张图片

  • option: 包含执行的模块和执行的命令参数

 

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

Ad-Hoc命令集支持的模块有很多, 其中ansible-doc 命令常用于获取模块信息及其使用帮助,一般用法如下:

ansible-doc -l #获取全部模块的信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助

自动化运维与python项目实战:Ansible自动化任务_第4张图片

实例演示:

  • 主机连通性测试
ansible test -m ping

自动化运维与python项目实战:Ansible自动化任务_第5张图片

 

  • command 模块

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

ansible test -m command -a 'df -h'

自动化运维与python项目实战:Ansible自动化任务_第6张图片

 

  • shell 模块

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

 ansible test -m shell -a 'cat /etc/passwd | grep "^root"'

 

  • copy 模块

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

#复制文件

ansible test -m copy -a 'src=/etc/passwd dest=/mnt'

自动化运维与python项目实战:Ansible自动化任务_第7张图片

#给定内容生成文件,并设定权限

ansible test -m copy -a "content='hello ansible' dest='/mnt/ansible' mode ='666'"

 

  • yum 模块

顾名思义,该模块主要用于软件的安装,可批量在多台主机上安装。

ansible test -m yum -a 'name=nginx state=present'

自动化运维与python项目实战:Ansible自动化任务_第8张图片

 

  • service 模块

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

#开启服务并设置自启动

absible test -m service -a 'name=niginx state=started enabled=true'

自动化运维与python项目实战:Ansible自动化任务_第9张图片

#关闭服务

ansible test -m service -a 'name=nginx state=stopped'

自动化运维与python项目实战:Ansible自动化任务_第10张图片

 

Ansible Playbook模式

1.什么是Playbook及其组成

  • playbook不同于ad-hoc模式,适合部署复杂应用程序。
  • 优势: Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。
  • playbook是通过YAML格式来进行描述定义的, 语法简单,操作方便。
  • playbook由一个或者多个play组成, 一个play可以包含多个task, 因此可使用多个不同的模块完成一件事情。
  • play: 定义的是主机的角色
  • task:定义具体执行的任务,由模板定义的操作列表

 

2.Playbook的配置语法

playbook基本使用​​​​​​​

ansible-playbook playbook.yml [options]

常用选项总结:

自动化运维与python项目实战:Ansible自动化任务_第11张图片

 

3.playbook的第一个应用案例

yaml语法要点:

  • yaml文件以"---"作为文档的开始
  • 缩进:表示层级结构,每个缩进由两个空格组成, 不能使用tab。
  • 冒号: 以冒号结尾的除外,其他所有冒号后面所有必须有空格。
  • 短横线: 表示列表项,使用一个短横杠加一个空格。
  • 大小写敏感

 

ansible的主配置文件设定​​​​​​​:

[defaults]
# 资源清单inventory文件的位置
inventory = /etc/ansible/hosts
# 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
library = /usr/share/ansible
# 设置默认执行命令的用户`
sudo_user = root
#不检测要连接的主机是否在known_hosts用户中
host_key_checking=False

# ssh连接的管理端口,默认为22端口,建议修改,更加安全
remote_port = 22

# 存储ansible日志的文件(默认不记录日志)
log_path = /var/log/ansible.log

[ssh_connection]
ssh_args = -o StrictHostKeyChecking=no

 

ansible的主机清单管理:

[test]
172.25.254.10:22 ansible_ssh_user=root ansible_ssh_pass='123'
172.25.254.20:22 ansible_ssh_user=root ansible_ssh_pass='123'

 

创建yaml文件并编辑:

---
- hosts: test
  remote_user: root
  vars:
          filename: "westos.c"
          http_port: 8080
  tasks:
         #任务1:在指定位置创建文件
         - name: test
           file: name=/mnt/{
    {filename}} state='touch'
         #任务2:创建新用户
         - name: create new user
           user: name=winter uid=1009 system=yes shell=/bin/bash
         #任务3:安装httpd
         - name: install http package
           yum: name=httpd state='present'
         #任务4:改写httpd配置文件中的端口为8080
         #此步骤前需在当前目录下 mkdir template -> cp /etc/httpd/conf/httpd.conf template/
         #然后将template/httpd.conf文件中的第45行修改为Listen {
    {http_port}}         
         - name: config http
           template: src=./template/httpd.conf dest=/etc/httpd/conf/httpd.conf
           notify:
                  - restart apache
         #任务5:复制index文件
         #执行此步骤前,需在template/目录下创建index.html
         - name: copy index.html
           copy: src=./template/index.html dest=/var/www/html/index.html backup=yes mode=666
  handlers:
         - name: restart apache
           service: name=httpd state=restarted enabled=true
~        

 

测试  在安装有ansible的服务器做测试

ansible-playbook westos.yml

自动化运维与python项目实战:Ansible自动化任务_第12张图片

 

 

 

 

你可能感兴趣的:(Python)