您现在的位置是:首页 >技术杂谈 >Linux-ansible的使用网站首页技术杂谈

Linux-ansible的使用

哈密猿 2023-07-11 12:00:02
简介Linux-ansible的使用

ansible

介绍

Ansible是一个开源的自动化工具,可以帮助您自动化部署、配置和管理计算机系统。在Linux中,Ansible是一种常用的工具,它使用SSH协议来连接远程服务器,并通过编写playbook(剧本)来实现自动化管理。

运维工具:ansible、puppet、salt
云计算、docker、大数据、运维等
ansible:简单、轻量级(使用python写的)

它可以在一台ansible机器上,操控别的服务器,进行一些文本传输、指令执行等批量任务
ansible基于python开发,依赖于:paramiko,PyYaml和jinja三个关键组件

ansible的组成

在Linux中,Ansible由以下几个组件组成:

  1. Ansible Core:Ansible的核心组件,它包含了用于管理和自动化IT基础设施的各种功能和工具。

  2. Inventory:Ansible使用一个称为“Inventory”的清单来管理目标主机。清单包含了主机名、IP地址、主机组等信息,可以手动编写或从现有系统中动态生成。

  3. Playbook:Playbook是一组命令,用于定义对主机或主机组执行的任务,包括配置管理、部署、应用程序安装等。

  4. Modules:模块是Ansible的另一个核心组件,它们是Ansible用来执行任务的工具。每个模块都是一个可执行的脚本,可以在远程主机上执行命令、复制文件、管理用户等。

  5. Plugins:插件是Ansible用于扩展和自定义其行为的方式。插件可以用来定义新的模块、清单插件、插件过滤器等。

  6. API:Ansible API是一个Python库,可以通过编程方式使用Ansible的核心功能。它提供了一种将Ansible功能与其他工具集成的方法。

ansible组成:
   1、host  inventory  --#定义客户机, 可以对客户机进行分类:db类,web类。。。等等
   2、playbook         --#剧本 让主机按照我给定的剧本去完成一些事情
   3、module           --#模块 实现一个个功能的程序
   4、pluging          --#插件 实现一些额外的小功能

实验前提

安装ansible

yum  install epel-release
yum  install  ansible

实验环境
a: 192.168.77.132 (ansible)
c: 192.168.77.133
b: 192.168.77.134

实验前提,做好免密码认证,详见 ssh服务
a -->b ,a–>c a可以免密码登陆到b和c

配置目录

   /etc/ansible/ansible.cfg   
   ansible的主配置文件,此文件主要定义了roles_path的路径,主机清单路径,连接清单中的主机方式等等
   /etc/ansible/hosts
   这个配置文件就是默认的主机清单配置文件, 可以通过ansible.cfg 重新定义

添加主机:

备份原本的hosts文件,防止意外
[root@localhost ansible]# cp hosts{,.bak}
[root@localhost ansible]# >hosts 			清空文件
编辑hosts文件,添加监控主机
[root@localhost ansible]# vim hosts

使用

选项

Ansible是一个功能丰富的自动化工具,提供了多种选项来控制其行为。以下是一些常用的选项:

  • -i INVENTORY, --inventory-file=INVENTORY:指定Ansible使用的主机清单文件路径。默认为/etc/ansible/hosts
  • -u REMOTE_USER, --user=REMOTE_USER:指定远程主机登录用户名。
  • -k, --ask-pass:提示用户输入远程主机登录密码。
  • -K, --ask-become-pass:提示用户输入sudo或su特权密码。
  • -c CONNECTION, --connection=CONNECTION:指定连接类型,如sshlocaldocker等。
  • -m MODULE_NAME, --module-name=MODULE_NAME:指定要执行的模块名称。
  • -a MODULE_ARGS, --args=MODULE_ARGS:指定传递给模块的参数。
  • -f FORKS, --forks=FORKS:指定Ansible在多少个主机上并行执行任务。
  • -t TIMEOUT, --timeout=TIMEOUT:指定连接超时时间。
  • -v, --verbose:增加输出详细程度。可以多次使用以增加详细程度。
  • -e EXTRA_VARS, --extra-vars=EXTRA_VARS:指定额外的变量,可以在Ansible Playbook中使用。
  • -l SUBSET, --limit=SUBSET:指定要操作的主机子集。

实例

在所有主机上创建一个目录/tmp/sc

[root@localhost ansible]# ansible all -m shell -a "mdkir /tmp/sc"

在没有登录自己主机的情况

ansible 管理

root@192.168.242.131:22 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname 192.168.242.131:22: Name or service not known", 
    "unreachable": true
}
yandonghao@192.168.242.129 | FAILED | rc=127 >>
/bin/sh: 1: mdkir: not foundnon-zero return code

[root@localhost ansible]# ssh root@192.168.242.131

由于自己进入自己没有免密码登录,需要自己登录自己,然后退出

[root@localhost ansible]# ansible all -m shell -a "mkdir /tmp/sc2"
 [WARNING] Ansible is being run in a world writable directory (/etc/ansible), ignoring it as an ansible.cfg source. For more information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir
[WARNING]: Consider using the file module with state=directory rather than running 'mkdir'.  If you
need to use command because file is insufficient you can add 'warn: false' to this command task or
set 'command_warnings=False' in ansible.cfg to get rid of this message.
root@192.168.242.131 | CHANGED | rc=0 >>

yandonghao@192.168.242.129 | CHANGED | rc=0 >>
>>>>>>>>>>>>>>
rc       -- return code 返回状态码,
>返回0就是执行成功了,非0,就是执行失败

模块

copy

copy 是 Ansible 中的一个常用模块,用于将文件或者文本内容复制到远程主机上。下面是该模块的详细介绍和使用方法:

介绍

copy 模块可以将本地文件复制到远程主机上,也可以将文本内容写入远程主机上的文件中。该模块支持设置文件的权限和所有者、组、目录等。

使用

以下是使用 copy 模块复制文件的基本语法:

ansible <host-pattern> -m copy -a "src=<source> dest=<destination>"

其中,<host-pattern> 表示要操作的主机,可以是单个主机名、IP 地址,也可以是主机名的列表或通配符;

-a:指定模块的参数

src= 源文件路径

dest= 目标路径

注意src= 路径后面带/ 表示带里面的所有内容复制到目标目录下,不带/是目录递归复制过去

以下是使用 copy 模块将文本内容写入远程主机文件的基本语法:

ansible <host-pattern> -m copy -a "content=<content> dest=<destination>"

其中,content 表示要写入远程主机文件的文本内容。

除了以上基本用法,copy 模块还支持以下参数:

  • mode:设置文件的权限,如 mode=0644
  • owner:设置文件的所有者,如 owner=root
  • group:设置文件的所属组,如 group=users
  • directory_mode:设置目录的权限,如 directory_mode=0755
  • backup:设置备份文件的后缀,如 backup=yesbackup=.bak

以下是使用 copy 模块的几个例子:

  1. 将本地文件复制到远程主机上:

    ansible web -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf"
    
  2. 将本地文件复制到远程主机上,并设置文件权限和所有者:

    ansible web -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf mode=0644 owner=root"
    
  3. 将文本内容写入远程主机文件:

    ansible web -m copy -a "content='Hello world!' dest=/tmp/hello.txt"
    
  4. 将文本内容写入远程主机文件,并设置文件权限和所属组:

    ansible web -m copy -a "content='Hello world!' dest=/tmp/hello.txt mode=0644 group=users"
    

执行在hosts的主机,将/lianxi/sad.txt,复制到/lianxi/sad-copy.txt,同时将复制的文件命名为sad-copy.txt,设置文件的权限为777,设置属主和数组。

[root@localhost lianxi]# ansible all -m copy -a "src=/lianxi/sad.txt dest=/lianxi/sad-copy.txt mode=777 owner=sanchuang group=sanchuang"

在使用 copy 模块时,需要确保远程主机上的目录和文件存在,否则会出现错误。如果需要创建目录,可以使用 file 模块。

fetch

fetch 模块是 Ansible 的一个模块,用于从远程主机上复制文件到控制节点上。

以下是 fetch 模块的使用示例:

ansible <host-pattern> -m fetch -a "src=<remote_file_path> dest=<local_file_path>"

其中,各个参数的含义如下:

  • <host-pattern>:目标主机的模式,可以是单个主机的 IP 地址或主机名,也可以是一个用逗号分隔的主机列表,还可以是一个包含多个主机的组名。例如,all 表示所有主机。
  • <remote_file_path>:需要从远程主机上复制的文件路径,可以是文件的绝对路径,也可以是相对路径。
  • <local_file_path>:本地文件保存的路径,可以是文件的绝对路径,也可以是相对路径。

下面是一个示例:

ansible webserver -m fetch -a "src=/var/log/nginx/access.log dest=/tmp/"

上述示例的含义是,从名为 webserver 的主机上复制 /var/log/nginx/access.log 文件到本地的 /tmp/ 目录中。

在使用 fetch 模块时,需要确保控制节点有权限读取远程主机上的文件,否则会出现权限不足等错误。

将hosts中所有主机下的/etc/group 复制到当前主机中的/opt/ansible/group中

[root@localhost ansible]# ansible all -m fetch -a "src=/etc/group dest=/opt/ansible/group"

[root@localhost ansible]# cd /opt/ansible
[root@localhost ansible]# ls
group

按主机划分

[root@localhost ansible]# tree
.
└── group
    ├── root@192.168.242.131
    │   └── etc
    │       └── group
    └── yandonghao@192.168.242.129
        └── etc
            └── group

shell

shell 是 Ansible 中的一个模块,它允许在远程主机上执行 shell 命令或脚本。

使用 shell 模块,您可以执行任何 shell 命令,比如常见的 lscprm 等。示例:

ansible all -m shell -a "ls /home"

上面的命令将在所有远程主机上执行 ls /home 命令,显示 /home 目录下的所有文件和文件夹。

您也可以使用 shell 模块执行复杂的 shell 命令或脚本。比如,假设您有一个 shell 脚本 backup.sh,您可以使用以下命令在所有远程主机上执行它:

ansible all -m shell -a "/path/to/backup.sh"

使用 -a 参数指定要在远程主机上执行的命令或脚本。您还可以使用其他一些常见的参数,例如 -u 指定远程主机的用户名,-b 使用特权模式运行命令等。

[root@localhost ansible]# ansible all -m shell -a "free -m"

该命令用于查看当前系统的内存使用情况。执行结果将会返回每个主机执行命令的输出信息

file

Ansible是一个自动化工具,可用于部署、配置和管理远程主机。在Ansible中,file模块可用于管理文件系统上的文件和目录。

file模块的基本语法如下:

- name: Example of using the file module
  file:
    path: /path/to/file
    owner: owner_name
    group: group_name
    mode: "0644"
    state: present

其中,path参数是必需的,指定文件或目录的路径。其他参数是可选的:

  • owner:指定文件或目录的所有者。
  • group:指定文件或目录的组。
  • mode:指定文件或目录的权限模式。
  • state:指定文件或目录的状态,可以是present(默认)、absent、directory、link或hard。

下面是一些示例:

  1. 创建一个空文件
- name: Create an empty file
  file:
    path: /path/to/file
    state: touch
  1. 创建一个目录
- name: Create a directory
  file:
    path: /path/to/directory
    state: directory
[root@localhost ansible]# ansible all -m file -a "path=/tmp/sanchuang state=directory"
  1. 更改文件的所有者和组
- name: Change owner and group of a file
  file:
    path: /path/to/file
    owner: owner_name
    group: group_name
  1. 更改文件的权限
- name: Change mode of a file
  file:
    path: /path/to/file
    mode: "0644"
  1. 删除文件
- name: Delete a file
  file:
    path: /path/to/file
    state: absent
[root@localhost ansible]# ansible all -m file -a "path=/tmp/sanchuang state=absent"
  1. 创建符号链接
- name: Create a symbolic link
  file:
    src: /path/to/source
    dest: /path/to/link
    state: link
  1. 创建硬链接
- name: Create a hard link
  file:
    src: /path/to/source
    dest: /path/to/link
    state: hard

cron

在Ansible中,cron模块可用于管理Linux系统上的crontab任务。

cron是Linux系统中的一个后台服务,可定期运行指定的命令或脚本。使用Ansible的cron模块可以轻松地添加、修改和删除crontab任务。

cron模块的基本语法如下:

- name: Example of using the cron module
  cron:
    name: "Task name"
    minute: "*/5"
    hour: "*"
    day: "*"
    month: "*"
    weekday: "*"
    user: user_name
    job: /path/to/command
    state: present

其中,name参数是任务的名称,minute、hour、day、month、weekday参数用于指定任务运行的时间。其他参数是可选的:

  • user:指定任务所属的用户,默认为root用户。
  • job:指定任务要运行的命令或脚本。
  • state:指定任务的状态,可以是present(默认)、absent 删除 (基于name)、reboot、present-with-comment或absent-with-comment。

下面是一些示例:

  1. 添加一个crontab任务
- name: Add a cron job
  cron:
    name: "Task name"
    minute: "*/5"
    hour: "*"
    day: "*"
    month: "*"
    weekday: "*"
    user: user_name
    job: /path/to/command
[root@localhost ansible]# ansible all -m cron -a "minute=*/3 job='date>>/tmp/time.txt' name=cron_ansible state=present"

查看是否生成新的计划任务

[root@localhost tmp]# crontab -l
#Ansible: cron_ansible
*/3 * * * * date>>/tmp/time.txt
  1. 修改一个crontab任务
- name: Modify a cron job
  cron:
    name: "Task name"
    minute: "0"
    hour: "1"
    day: "*"
    month: "*"
    weekday: "*"
    user: user_name
    job: /path/to/new_command
  1. 删除一个crontab任务
- name: Remove a cron job
  cron:
    name: "Task name"
    state: absent
[root@localhost ansible]# ansible all -m cron -a "minute=*/3 job='date>>/tmp/time.txt' name=cron_ansible state=absent"

查看是否删除成功

[root@localhost tmp]# crontab -l
[root@localhost tmp]# 

ntp服务,是一个时间管理服务器
在 centos 8 中, ntp 已经被 chrony 代替。
之前的版本:yum install -y ntp
centos8:yum install chrony

每三分钟输出当前时间,到/tmp/time.txt文件

[root@b ~]# ansible all -m cron -a "minute=*/3 job='date >>/tmp/time.txt' name=date_test  state=present"

每天凌晨1点 检查/etc/passwd 文件是否被修改,并且生成检查报告
实现ansible node节点服务器备份 备份/var/log/messages 备份到/backup目录下,并且取名2020-11-25-01-log.tar.gz,每一个小时执行一次

ansible web -m cron -a "minute=*/1 job='tar -czf /tmp/sc/$(date +%Y-%m-%d-%H)-log.tar.gz /var/log/messages' name=date_test state=present"

yum

在Ansible中,yum模块可用于在Linux系统上管理软件包。yum是一种软件包管理器,用于自动下载、安装、更新和删除软件包及其依赖项。

yum模块的基本语法如下:

- name: Example of using the yum module
  yum:
    name: package_name
    state: present

其中,name参数是必需的,指定要安装或卸载的软件包名称。state参数是可选的,指定软件包的状态,可以是present(默认)、absent或latest。

除了安装和卸载软件包,yum模块还支持更新和检查软件包状态的功能。

下面是一些示例:

  1. 安装一个软件包
- name: Install a package
  yum:
    name: package_name
    state: present

安装wget

[root@b ~]# ansible all -m yum -a "name=wget state=installed"
  1. 卸载一个软件包
- name: Remove a package
  yum:
    name: package_name
    state: absent

删除

[root@b ~]# ansible all -m yum -a "name=wget state=absent"
  1. 更新所有软件包
- name: Update all packages
  yum:
    name: "*"
    state: latest
  1. 检查软件包状态
- name: Check the state of a package
  yum:
    name: package_name
    state: query

除了以上示例,yum模块还有其他一些参数和用法。可以查看官方文档来了解更多详细信息。

service

在Ansible中,service模块可用于管理Linux系统上的系统服务,例如启动、停止、重启服务等。

service模块的基本语法如下:

- name: Example of using the service module
  service:
    name: service_name
    state: started

其中,name参数是必需的,指定要管理的服务的名称。state参数是可选的,指定服务的状态,可以是started(默认)、stopped、restarted、reloaded等。

除了管理服务的状态,service模块还支持检查服务的状态、启用或禁用服务、重载服务配置等功能。

下面是一些示例:

  1. 启动一个服务
- name: Start a service
  service:
    name: service_name
    state: started
  1. 停止一个服务
- name: Stop a service
  service:
    name: service_name
    state: stopped
[root@localhost ansible]# ansible all -m service -a "name=firewalld state=stopped "
  1. 重启一个服务
- name: Restart a service
  service:
    name: service_name
    state: restarted
  1. 重载一个服务的配置
- name: Reload a service
  service:
    name: service_name
    state: reloaded

vsftpd

介绍

vsftpd是一种高度安全且可靠的FTP服务器软件,全称为Very Secure FTP Daemon。它是一个免费的开源软件,可以在Linux和其他UNIX系统上运行。

vsftpd具有许多安全特性,例如支持SSL / TLS加密传输、防止用户访问根目录、限制用户访问、限制IP访问等。此外,它还提供了一些高级功能,例如虚拟用户、虚拟IP、上传/下载速度限制等。

vsftpd的配置相对简单,它的默认配置文件位于/etc/vsftpd.conf。通过编辑该文件可以配置FTP服务器的各种参数和选项。

一些常见的配置选项包括:

  • 匿名用户访问:anonymous_enable=YES
  • 限制用户登录:local_enable=YES,write_enable=YES
  • SSL / TLS支持:ssl_enable=YES,ssl_ciphers=HIGH
  • 限制IP访问:tcp_wrappers=YES,设置/etc/hosts.allow和/etc/hosts.deny

安装和配置vsftpd可以帮助用户快速搭建FTP服务器,从而实现文件传输和共享。

使用

关闭vsftpd服务

[root@b ~]# ansible all -m service -a "name=vsftpd state=stopped"

开启vsftpd服务

[root@b ~]# ansible all -m service -a "name=vsftpd state=started"

使用ansible 部署web服务
安装nginx, 修改nginx的配置文件 /etc/nginx/conf.d/sc.conf
传递index.html文件 到 /opt/dist目录下
index里面的内容: this is index

启动服务
测试能不能访问

server {
        listen       80 ;
        server_name  www.sc.com;
        root         /opt/dist;
    access_log  /var/log/nginx/sc_access.log  main;
        location / {
    }
    location =/api {
    }
}

script

在Ansible中,script模块可以用于在目标主机上运行任意的本地脚本或命令。该模块将本地脚本复制到目标主机上并在目标主机上执行。

script模块的基本语法如下:

- name: Example of using the script module
  script: path/to/local_script.sh

其中,path/to/local_script.sh是要在目标主机上运行的本地脚本的路径。

除了运行本地脚本,script模块还支持传递参数给脚本、设置脚本超时时间、以及处理脚本的标准输出和错误输出等功能。

下面是一些示例:

  1. 运行本地脚本
- name: Run a local script
  script: path/to/local_script.sh
  1. 运行本地脚本并传递参数
- name: Run a local script with arguments
  script: path/to/local_script.sh arg1 arg2
[root@b ~]# cat test.sh
#!/bin/bash
echo "test ansible" >> /tmp/ansible.txt
[root@b ~]# ansible all -m script -a "/root/test.sh" -f 6

这个命令表示使用 Ansible 的 script 模块,在所有的目标主机上执行 /root/test.sh 脚本,并将并发度设置为 6。 -f 参数用于指定 Ansible 在同时运行的任务数上的限制。默认情况下,Ansible使用5个并发线程运行任务,您可以使用 -f 参数增加或减少这个数值。

  1. 运行本地脚本并设置超时时间
- name: Run a local script with timeout
  script:
    script: path/to/local_script.sh
    timeout: 60
  1. 运行本地脚本并处理输出
- name: Run a local script and handle output
  script:
    script: path/to/local_script.sh
    register: script_output
  debug:
    var: script_output.stdout_lines

scp

scp是一种在Linux系统中进行安全文件传输的命令行工具。它使用SSH协议加密传输数据,并且在远程主机上必须安装SSH服务。
以下是一些常用选项:

选项

  • -P port:指定SSH端口号。
  • -r:递归复制整个目录。
  • -C:开启压缩传输。
  • -v:详细输出传输进程信息。

实例

例如,以下命令将使用SSH端口号2222从本地主机上传文件到远程主机:

scp -P 2222 /path/to/local/file remote_user@remote_host:/path/to/remote/file。

以下是使用scp命令进行文件传输的一般语法:

scp [options] [source] [destination]

其中options是可选的,它们可以用来指定传输的参数,例如端口号、递归模式等。source是要传输的文件或目录的路径,destination是文件或目录传输到的位置。在传输文件时,可以在文件名前加上用户名和主机名来指定远程主机,格式如下:

[username@]host:[path]

以下是几个常见的使用情况:

  1. 从远程主机下载文件到本地主机:
scp remote_user@remote_host:/path/to/remote/file /path/to/local/file

这将从远程主机下载文件到本地主机。

  1. 从本地主机上传文件到远程主机:
scp /path/to/local/file remote_user@remote_host:/path/to/remote/file

这将从本地主机上传文件到远程主机。

  1. 从远程主机下载整个目录到本地主机:
scp -r remote_user@remote_host:/path/to/remote/directory /path/to/local/directory

这将从远程主机下载整个目录到本地主机。

  1. 从本地主机上传整个目录到远程主机:
scp -r /path/to/local/directory remote_user@remote_host:/path/to/remote/directory

这将从本地主机上传整个目录到远程主机。

​ 5.将对象的/etc/passwd 复制到当前目录下

[root@localhost ansible]# scp yandonghao@192.168.242.129:/etc/passwd ./ 
passwd                                                            100% 1870   975.7KB/s   00:00    
[root@localhost ansible]# ls
ansible.cfg  hosts  hosts.bak  passwd  roles

​ 6.将 需要 转送的文件复制到对象的家目录(也可以在对象ip后面加路径)

[root@localhost ansible]# scp ansible.cfg  yandonghao@192.168.242.129: 
ansible.cfg                                                       100%   20KB   8.9MB/s   00:00 
yandonghao@ydh:~$ ls
 ansible.cfg  '~index.html'   ssh   yandonghao   表单.html

paramiko

ansible:使用python写的简单、轻量级的运维工具
它可以在一台ansible机器上,操控别的服务器。进行一些文本传输,指令执行等批量任务

Paramiko是一个Python模块,可用于在Linux系统中通过SSH(Secure Shell)进行远程控制和文件传输。以下是在Linux中使用Paramiko的详细介绍和使用步骤:

  1. 安装Paramiko

要安装Paramiko,可以使用pip命令:

pip install paramiko
  1. 连接到远程主机

要使用Paramiko连接到远程主机,请使用SSHClient类:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='remote_server', username='username', password='password')

在此示例中,使用SSHClient类创建一个SSH连接,指定远程服务器的主机名、用户名和密码。

  1. 远程执行命令

要在远程主机上执行命令,请使用SSHClient的exec_command()方法:

stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())

在此示例中,使用exec_command()方法在远程主机上执行ls -l命令,并使用stdout.read().decode()方法将输出作为字符串打印。

  1. 上传和下载文件

要上传文件,请使用SFTPClient类的put()方法:

sftp = ssh.open_sftp()
sftp.put('/local/file/path', '/remote/file/path')
sftp.close()

在此示例中,使用SFTPClient的put()方法将本地文件上传到远程服务器。

要下载文件,请使用SFTPClient类的get()方法:

sftp = ssh.open_sftp()
sftp.get('/remote/file/path', '/local/file/path')
sftp.close()

在此示例中,使用SFTPClient的get()方法将远程服务器上的文件下载到本地系统。

paramiko的SSHClient

Paramiko是一个用Python编写的SSH(Secure Shell)工具包,可以用于远程控制和文件传输。Paramiko中包含了SSH客户端类SSHClient,可用于与远程服务器进行SSH通信。以下是Paramiko中SSHClient的基本用法:

  1. 导入Paramiko模块

在使用Paramiko中的SSHClient之前,需要先导入Paramiko模块:

import paramiko
  1. 创建SSHClient对象

要创建SSHClient对象,需要使用SSHClient()构造函数。在创建SSHClient对象之前,应该设置MissingHostKeyPolicy,以避免连接未知主机时出现问题:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

在此示例中,使用AutoAddPolicy()指定自动添加新主机的策略。

  1. 连接远程主机

要使用SSHClient连接到远程主机,可以使用SSHClient的connect()方法。connect()方法接受主机名、用户名、密码等参数:

ssh.connect(hostname='remote_host', username='user', password='password')

在此示例中,使用connect()方法连接到远程主机,并指定主机名、用户名和密码。

  1. 执行命令

要在远程主机上执行命令,请使用SSHClient的exec_command()方法:

stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())

在此示例中,使用exec_command()方法在远程主机上执行ls -l命令,并使用stdout.read().decode()方法将输出作为字符串打印。

  1. 上传和下载文件

要上传文件,请使用SFTPClient类的put()方法:

sftp = ssh.open_sftp()
sftp.put('/local/file/path', '/remote/file/path')
sftp.close()

在此示例中,使用SFTPClient的put()方法将本地文件上传到远程服务器。

要下载文件,请使用SFTPClient类的get()方法:

sftp = ssh.open_sftp()
sftp.get('/remote/file/path', '/local/file/path')
sftp.close()

在此示例中,使用SFTPClient的get()方法将远程服务器上的文件下载到本地系统。

总之,SSHClient是Paramiko中的一个核心组件,可用于连接远程主机,执行命令以及上传和下载文件。它为Python程序员提供了一种使用SSH进行远程控制和文件传输的强大工具。

实例

[root@sc-server python-test]# cat paramiko-test.py 
import paramiko   
# 实例化SSHClient  
ssh_client = paramiko.SSHClient()   
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接 ,此方法必须放在connect方法的前面
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())   
# 连接SSH服务端,以用户名和密码进行认证 ,调用connect方法连接服务器
ssh_client.connect(hostname='192.168.227.137', port=22, username='sanchuang', password='123456')   
# 打开一个Channel并执行命令  结果放到stdout中,如果有错误将放到stderr中
stdin, stdout, stderr = ssh_client.exec_command('touch aa') 
# stdout 为正确输出,stderr为错误输出,同时是有1个变量有值   
#打印执行结果  
print(stdout.read().decode('utf-8'))  
# 关闭SSHClient连接 
ssh_client.close()

pssh

pssh是一个用于在多台远程主机上并行执行命令的工具。pssh允许您通过ssh连接到多台远程主机,然后在这些主机上同时执行相同的命令。pssh还提供了许多高级功能,例如在远程主机上复制文件,使用自定义选项执行命令等。

使用pssh之前,您需要在本地主机和所有远程主机之间建立ssh连接。确保您可以通过ssh连接到所有远程主机,无需输入密码。您可以使用ssh-keygen命令生成公钥和私钥,然后将公钥复制到所有远程主机的~/.ssh/authorized_keys文件中。

安装pssh

pssh是一个Python模块,可以使用pip安装:

pip install pssh
[root@localhost 4-11]# yum install pssh -y

或者,您也可以在Debian或Ubuntu系统上使用apt-get安装pssh:

sudo apt-get install pssh

使用pssh

使用pssh非常简单,只需执行以下命令即可:

pssh -h hosts.txt command

在上面的命令中,hosts.txt是包含所有远程主机的主机列表文件,command是要在远程主机上执行的命令。

例如,如果您要在名为hosts.txt的主机列表文件中列出的所有主机上执行df命令,可以执行以下命令:

pssh -h hosts.txt df

pssh会同时在所有远程主机上执行df命令,并将结果输出到本地终端。如果您只想在某些主机上执行命令,您可以在主机列表文件中列出这些主机的IP地址或主机名。

在pssh命令中,您还可以使用许多选项来自定义操作:

  • -l user:指定用于ssh连接的用户名,默认为当前用户名。

  • -p num:指定要使用的ssh端口号,默认为22。

  • -i identity_file:指定要使用的私钥文件,默认为~/.ssh/id_rsa。

  • -t timeout:指定ssh连接的超时时间,默认为60秒。

  • -o option:指定要传递给ssh的其他选项,例如-o “StrictHostKeyChecking=no”。

  • -O option:指定要传递给pssh的其他选项,例如-O “ConnectTimeout=30”。

  • -v:启用详细输出模式。

除了执行命令之外,pssh还支持在远程主机上复制文件,使用自定义选项执行命令等高级功能。您可以通过运行以下命令来获取pssh的完整文档:

man pssh

或者,您可以在命令行中运行以下命令来查看pssh的帮助:

pssh --help

实例

在当前主机上执行pssh命令,使用ip.txt文件中列出的所有IP地址或主机名建立ssh连接,然后在所有这些远程主机上执行df -Th命令。df -Th命令用于列出所有文件系统的磁盘空间使用情况,以可读格式显示大小。

[root@localhost 4-11]# vim ip.txt
[root@localhost 4-11]# cat ip.txt 
root@192.168.242.131:22
yandonghao@192.168.242.129
[root@localhost 4-11]# pssh -h ip.txt "df -Th"
[1] 14:40:24 [SUCCESS] root@192.168.242.131:22
[2] 14:40:24 [SUCCESS] yandonghao@192.168.242.129

playbook

自动化执行
如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象
语法 yaml 格式配置

介绍

Ansible Playbook 是一个声明式的配置管理工具,它使用 YAML 格式的文件来定义一组任务和操作,用于自动化管理和配置 Linux 主机。Playbook 提供了一种简单而强大的方法来组织多个任务和操作,以实现复杂的部署和配置需求。

1、playbook的核心元素

hosts : playbook配置文件作用的主机
tasks: 任务列表
variables: 变量 
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等

2、playbook运行方式

ansible-playbook --check 只检测可能会发生的改变,但不真执行操作
ansible-playbook --list-hosts 列出运行任务的主机
ansible-playbook --syntax-check playbook.yaml 语法检测
ansible-playbook -t TAGS_NAME playbook.yaml 只执行TAGS_NAME任务
ansible-playbook playbook.yaml 运行


yaml 格式
大小写敏感
使用缩进表示层级表示,不要大tab,只能用空格缩颈
相同层级的元素左对齐
字符串可以不用引号标注
号单行注释

使用

  • 先定义a.ymal
[root@localhost python-test]# cat a.ymal 
class:
    mjh:
        - chenli
        - tangyuzhi
        - xiangding
    twg:
        - liuxiaoxiao
        - quanyan

调用a.ymal

[root@localhost tmp]# python3
Python 3.11.2 (main, Apr  7 2023, 13:38:16) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> with open("/opt/python-test/a.ymal") as fp:
...     data = yaml.load(fp,Loader=yaml.FullLoader)
...     print(data)
...     print(data)
... 
{'class': {'mjh': ['chenli', 'tangyuzhi', 'xiangding'], 'twg': ['liuxiaoxiao', 'quanyan']}}
{'class': {'mjh': ['chenli', 'tangyuzhi', 'xiangding'], 'twg': ['liuxiaoxiao', 'quanyan']}}
  • 定义b.yaml ,这是执行复制文件的操作
[root@localhost python-test]# cat b.yaml 
- hosts: all
  remote_user: root
  tasks:
  - name: up file
    copy: src=/etc/passwd dest=/tmp/passwd_tmp
  - name: down file
    fetch: src=/etc/passwd dest=/opt

执行文件

[root@localhost python-test]# ansible-playbook b.yaml 

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [root@192.168.242.137]

TASK [up file] *****************************************************************
changed: [root@192.168.242.137]

TASK [down file] ***************************************************************
changed: [root@192.168.242.137]

PLAY RECAP *********************************************************************
root@192.168.242.137       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

template的使用

template 基于jinja2模板语法去解析

根据一定的条件灵活的设置要复制文件中的部分关键内容,可以使用template模块
模板文件必须以j2结尾
模版语法

编写sc_template.conf.j2

[root@scmysql opt]# cat sc_template.conf.j2 
server {
        listen       {{ listen_port }} ;             //这里需要填入的
        server_name  www.sc.com;
        root         /opt/dist;
    access_log  /var/log/nginx/sc_access.log  main;
        location / {
    }
    location =/api {
    }
}

编写测试剧本

[root@scmysql opt]# cat template_test.yaml 

- hosts: web
  tasks:
  - name: template test
    template: src=/opt/sc_template.conf.j2 dest=/tmp/sc.conf

执行playbook, 指定listen_port变量的值

[root@scmysql opt]# ansible-playbook template_test.yaml -e "listen_port=8080"

也可以在hosts文件中 指定每一台主机的变量

[root@scmysql ansible]# cat hosts
[web]
192.168.77.133:22 listen_port=81
192.168.77.134  listen_port=666

一个完整流程

1.创建文本

[root@localhost python-test]# cat sc_template.conf.j2 
server {
        listen       {{ listen_port }} ;
        server_name  www.sc.com;
        root         /opt/dist;
    access_log  /var/log/nginx/sc_access.log  main;
        location / {
    }
    location =/api {
    }
}

2.写一个页面

[root@localhost python-test]# cat index.html 
this is index.html
hello,world

3.写一个剧本

[root@localhost python-test]# cat web_playbook.yaml 

- hosts: all
  tasks:
  - name: yum nginx
    yum: name=nginx state=installed
  - name: create dir /opt/dist
    shell: mkdir /opt/dist
  - name: template sc.conf
    template: src=/opt/python-test/sc_template.conf.j2 dest=/etc/nginx/conf.d/sc.conf  
  - name: copy index.html
    copy: src=/opt/python-test/index.html dest=/opt/dist/
  - name: start nginx
    service: name=nginx state=started

指定端口号号,执行文件

[root@localhost python-test]# ansible-playbook web_playbook.yaml -e "listen_port=8080"


>也可以在hosts文件中 单独指定每一台主机的变量
>[root@scmysql ansible]# cat hosts
>[web]
>192.168.77.133:22 listen_port=81
>192.168.77.134  listen_port=666

[nginx]
192.168.77.111

gin

gin的配置文件:

server {
        listen       80 ;
        server_name  www.sc.com;
        root         /opt/dist;
    access_log  /var/log/nginx/sc_access.log  main;
        location / {
    }
    location =/api {
    }
}

使用playbook去部署web服务

hosts: all
remote_user: root
tasks:

- name: yum nginx
  yum: name=nginx state=installed
- name: copy sc.conf
  copy: src=/lianxi/sc.conf dest=/etc/nginx/conf.d/sc.conf
- name: copy index
  copy: src=/lianxi/index.html dest=/opt/dist/
- name: start nginx
  service: name=nginx state=started
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。