Ansible 学习一之初识

Posted 我只想躺平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 学习一之初识相关的知识,希望对你有一定的参考价值。

一、Ansible 是什么

 下面仅仅Ansible的主要功能的一个简要的介绍,详细了解的话参考官网

  • Ansible 是一款自动化运维工具,可以实现批量系统配置、程序部署、运行命令等配置管理和应用部署的功能

  • Ansible 是基于 Paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力,只是提供一种框架。真正具有批量部署的是 Ansible 所运行的相关模块

  • Ansible 不需要在远程主机上安装任何 Agent 端 ,因为它是基于 SSH 来和远程主机进行通讯的

 

二、Ansible 架构组件

​ Ansible的基本架构:

  • 核心引擎:即 Ansible,是整个 Ansible 的核心
  • 核心模块(core modules):是 Ansible 自带的模块,使用这些模块将资源分发到被管理主机,使其执行特定任务或匹配特定状态
  • 自定义模块(custom modules):如果核心模块不能完成某种功能,可以添加自定义模块
  • 插件(plugins):用于完成模块功能的补充,包括连接插件、邮件插件等
  • 连接插件(Connection plugins):负责和被管理主机实现通信,除支持使用SSH连接外,还支持其它的连接方式
  • 主机清单(host inventory):定义 Ansible 管理的主机,默认是在 hosts 配置文件中定义节点,同时也支持自定义动态主机清单和指定配置文件路径
  • 剧本(playbook):定义 Ansible 任务的配置文件,可以将多个任务定义在一个剧本中,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理

 

三、Ansible 相关术语

  • 控制节点(Control node):指安装了 Ansible 的主机,也叫 Ansible 服务器端、管理机

    • Ansible 控制节点主要用于发布运行任务,执行控制命令
    • Ansible 的程序都安装在控制节点上,控制节点需要安装Python和Ansible所需的各种依赖库
  • 受控节点(Managed nodes):也叫客户机,就是想用 Ansible 服务端执行任务的客户服务器
  • 主机清单(Inventory):受控节点的列表,就是所有要管理的主机列表。
    • 主机清单文件 (hosts):清单列表默认保存在host文件中,可以使用IP地址或者主机名来表示具体的管理主机和认证信息,并可以根据主机的用户进行分组;文件的路径为:/etc/ansible/hosts (YUM 安装的情况下)
    • 默认的使用 hosts 文件定义主机列表,通过这个方式获得的被称为静态的获取主机清单,Ansible 还支持动态获取主机清单的方式 ( 后面再具体介绍 )
    • 动态的获取主机清单的方式,支持使用单个或者多个 Inventory ,并且支持多种文件格式 ( Yaml 、Py 等 ) ( 后面再具体介绍 )
  • 模块(Modules):模块是 Ansible 执行特定任务的代码块。Ansible 现在默认自带450多个模块,Ansible Galaxy公共存储库则包含大约1600个模块。
  • 任务(Task):是在 Ansible 客户机上执行的操作。可以使用 ad-hoc 单行命令执行一个任务。
  • 剧本 (Playbook):是利用 YAML 标记语言编写的可重复执行的任务列表,Playbook 实现了任务的更便捷。
  • 角色(roles):角色是 Ansible 1.2 版本引入的新特性,用于层次性、结构化地组织 Playbook。Roles能够根据层次型结构自动装载变量文件、tasks 以及 handlers 等。

 

四、Ansible 对节点的要求

1、对管理主机的要求
  • Python2 版本则要求 2.6 或者 2.7,Python3 的版本则要求版本高于 3.5 (目前使用的大部分是Centos7,Python 默认是 2.7 的版本,是符号要求的)
  • Windows 主机是不可以做管理主机
2、对被节点主机的要求
  • 对应 Python 的版本要求,和上面的管理节点的要求是一样的

  • 我们使用 SSH 协议与节点通讯,默认是使用 Sftp 的方式,如果 Sftp不可用,可以中配置文件 ansible.cfg 中配置为 Scp 的方式

 

五、Ansible 安装

1、安装方式说明
  • Ansible安装方式很多,主要的安装方式有 --- YUM 安装 、PIP 安装、 源码安装 、Apt-Get 方式等,常见的安装方式主要有两种 --- YUM 安装 、PIP 安装 ,比较推荐的是 YUM 安装
  • YUM 安装会在 /etc 下生产一个 ansible 目录 ( 里面包括两个文件 --- ansible.cfg 和 hosts ,一个目录 roles )
  • PIP 安装的话中系统里面不会生产相关目录和文件,要去官网上下载 ansible.cfg 文件 ,并创建 hosts 文件和 roles 目录,创建之后使用 Ansible 的时候 ,会自动识别到这些目录和文件
2、常见安装方式示例

1、YUM 安装的方式
# ansible 的安装使用的是 epel 源码,首先必须安装 epel 源

[root@test220 ~]# yum -y install epel-release
[root@test220 ~]# yum -y install ansible

#  想要安装指定版本,先查看下YUM源里面包括哪些版本,命令 yum list ansible --showduplicates | sort -r  

[root@test220 ~]# ansible --version
ansible 2.9.27
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u/root/.ansible/plugins/modules,  u/usr/share/ansible/plugins/modules]
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

[root@test220 ~]# ansible --help    #  ansible 命令查看帮助

2、PIP 安装的方式

[root@test238 ~]# curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
[root@test238 ~]# python get-pip.py

[root@test238 ~]# yum install gcc glibc-devel zlib-devel rpm-build openssl-deve -y
[root@test238 ~]# yum install python-devel

[root@test238 ~]# yum install python-devel
[root@test238 ~]# ansible --version

 

六、Ansible 相关命令工具

命令 作用说明
/usr/bin/ansible 主程序,命令执行工具
/usr/bin/ansible-docusr/bin/ansible 主程序,命令执行工具查看配置文档,模块功能查看工具
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

 

七、Ansible Inventory内置参数

参数 用途
ansible_ssh_hosts 定义 hosts ssh 地址
ansible_ssh_port 定义 hosts ssh 端口
ansible_ssh_user 定义 hosts ssh 用户
ansible_ssh_pass 定义 hosts ssh 认证口令
ansible_sudo 定义 hosts sudo 用户
ansible_sudo_pass 定义 hosts sudo 口令
ansible_sudo_exe 定义 hosts sudo 路径
ansible_connection 定义 hosts 连接方式
ansible_ssh_shell_type 定义 hosts shell 类型
ansible_ssh_private_key_file 定义 hosts 私钥
ansible_python_interpreter 定义 hosts 任务执行 python 的路径
ansible_*_interpreter 定义 hosts 其他语言解析的路径

 

八、Ansible 相关目录和文件

  • 安装后会生成的目录 ( YUM安装 ),如下

    • 配置文件目录:/etc/ansible
    • 执行文件目录:/usr/bin
    • Lib库依赖目录:/usr/lib/python-$version/site-packages/ansible/
    • Help文档目录:/usr/share/doc/ansible-$version/
    • Man文档目录:/usr/share/man/man1/
  • 安装后会生成的文件 ( YUM安装 ),如下
    • Ansible 主配置文件:/etc/ansible/ansible.cfg
    • Ansible 默认主机清单文件:/etc/ansible/hosts

 

九、Ansible 配置文件说明

1、配置文件的优先级

​ 从上到下,优先级递减

  * ANSIBLE_CONFIG       首先,Ansible命令会先检查环境变量,及这个环境变量将指向的配置文件
  * ./ansible.cfg       其次,将会检查当前目录下的ansible.cfg配置文件
  * ~/.ansible.cfg     再次,将会检查当前用户home目录下的`.ansible.cfg`配置文件
  * /etc/ansible/ansible.cfg   最后,将会检查在安装Ansible时自动生成的配置文件
2、主配置文件

配置文件--- ansible.cfg ,包括好几块,一般也不会去修改它,这里列举几个常见的参数,我们理解其中的意思就可以了 
主要关注下 [dafaults] 相关的配置

[defaults]
inventory = /etc/ansible/hosts     #  主机列表配置文件
library = /usr/share/my_modules/   #  库文件存放目录
remote_tmp = $HOME/.ansible/tmp    #  临时py命令文件存放在远程主机目录
local_tmp = $HOME/.ansible/tmp     #  本机的临时命令执行目录
forks = 5            #  默认并发数
poll_interval = 15   #  异步执行任务时查询间隔,默认15s
sudo_user = root     #  默认sudo 用户
ask_sudo_pass = True #  每次执行ansible命令是否询问ssh密码
ask_pass = True      #  连接时提示输入ssh密码
remote_port = 22     #  远程主机的默认端口,生产中这个端口应该会不同
timeout = 10         #  SSH连接超时时间,默认10s
roles_path = /etc/ansible/roles  #  默认下载的 Roles存放的目录
log_path = /var/log/ansible.log  #  指定存储 Ansible日志的文件,Ansible 默认是不记录日志的
host_key_checking = False        #  检查对应服务器的 host_key,建议取消注释,也就是不会弹出
3、主机清单配置文件

###  /etc/ansible/hosts
通常用于定义要管理的主机的认证信息,配置成主机组的方式,具体基于使用哪种连接方式(主要有两种)

1、基于密码的连接    # (多种表示方式)  

  [webserver]
  172.16.1.11  ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_apss="test123456"

  [db-server]
  172.16.1.20[1:3] ansible_ssh_user=root ansible_ssh_pass="123456"

  [mid-server]
  172.16.1.1[2:4]
  [webserver:vars]
  ansible_ssh_pass="123456"  

  #  此种方式必须明确把 ansible_ssh_pass 写进 hosts 文件中

2、 基于KEY 的连接(必须先配置 SSH 的免密登录 )    # (多种表示方式 )  

  [webserver]
  192.168.1.31:22

  [nginx]
  192.168.1.4[1:2]

  [k8s-node]
  node1 ansible_ssh_host=192.168.1.31 ansible_ssh_port=22
  node2 ansible_ssh_host=192.168.1.32 ansible_ssh_port=22
  node3 ansible_ssh_host=192.168.1.33 ansible_ssh_port=22

  [os-server:children]  #  os-server 组包括两个子组:apache 、nginx
  apache
  nginx

###   两种连接方式来运行 Ansible 的情况都有使用,一般情况下使用基于 KEY 的连接方式较多,后面的示例也采用这种方式

 

十、Ansible 之初体验

1、Ansible 的执行命令
  • Ansible 提供两种命令去完成任务

    • ad-hoc 命令,可以解决一些简单的任务
    • Ansible playbook,解决较复杂的任务
  • 在学习 Ansible 之初,先来学习 ad-hoc 命令,只要是 ansible 命令
2、配置 SSH 互信
  • 其实这里不是真正的 SSH 互信,只是 Ansible 管理机到被管理节点的单向互信
  • 真正的 SSH 互信是两个节点能够相互免密登录,而这里不需要被管理节点免密登录到 Ansible 管理机

[root@test220 ~]# ssh-keygen -t rsa -P  -f ~/.ssh/id_rsa
[root@test220 ~]# ssh-copy-id root@10.6.2.238

[root@test220 ~]# ssh 10.6.2.238
Last login: Thu Mar 10 13:58:23 2022 from test238
[root@test238 ~]# hostname
test238
[root@test238 ~]# exit
logout
Connection to 10.6.2.238 closed.
[root@test220 ~]# hostname
test220
3、编辑 hosts 文件

[root@test220 ~]# cp /etc/ansible/hosts /etc/ansible/hosts.default
[root@test220 ~]# vim /etc/ansible/hosts
[tests]
10.6.2.238
10.6.2.239
4、Ansible 使用示例

1、Ansible 命令语法

  # 语法格式:ansible <group> -m <module> -a <arguments>
  <group> :   主机组或者单个主机,或者 all
  <module> :  指使用的模块名字
  <arguments>:这里是可选参数,看具体模块功能而定

2、简单使用示例

   [root@test220 ~]# ansible tests -m ping         #  ping 模块
   10.6.2.238 | SUCCESS => 
    "ansible_facts": 
        "discovered_interpreter_python": "/usr/bin/python"
    , 
    "changed": false, 
    "ping": "pong"
    
   10.6.2.239 | SUCCESS => 
    "ansible_facts": 
        "discovered_interpreter_python": "/usr/bin/python"
    , 
    "changed": false, 
    "ping": "pong"
   

   [root@test220 ~]# ansible tests -m command -a "hostname"       #  command 模块
   10.6.2.239 | CHANGED | rc=0 >>
   test239
   10.6.2.238 | CHANGED | rc=0 >>
   test238

   [root@test220 ~]# vim /root/test.sh
   #!/bin/bash
   date >> /root/date.txt

   [root@test220 ~]# ansible tests -m script -a "/root/test.sh"     #  script 模块
   10.6.2.239 | CHANGED => 
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.6.2.239 closed.\\r\\n", 
    "stderr_lines": [
        "Shared connection to 10.6.2.239 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
   
   10.6.2.238 | CHANGED => 
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 10.6.2.238 closed.\\r\\n", 
    "stderr_lines": [
        "Shared connection to 10.6.2.238 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
   

   [root@test220 ~]# ansible all -m command -a "cat /root/date.txt"    # 这里 all 就代表定义的所有主机
   10.6.2.239 | CHANGED | rc=0 >>
   Thu Mar 10 14:40:16 CST 2022
   10.6.2.238 | CHANGED | rc=0 >>
   Thu Mar 10 14:40:11 CST 2022

   #  说明:在 hosts 文件定义主机组的时候,节点定义书写的顺序,不代表着 ansible 命令执行后消息输出的顺序

   [root@test220 ~]# ansible 10.6.2.239 -m command -a "cat /root/date.txt"
   10.6.2.239 | CHANGED | rc=0 >>
   Thu Mar 10 14:40:16 CST 2022

   #  也可以像上面的写法,只写主机组中的其中一个主机,只会针对这个主机进行相关的操作

以上是关于Ansible 学习一之初识的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维工具ansible--笔记一之简介安装/常用模块

初识Ansible

初识ansible

初识ansible

初识ansible playbook

运维管理工具Ansible初识