【自动化运维专题1】ansible的安装和配置及使用准备

1.环境准备

现准备3台机器,一台作为控制节点,安装ansible,另外两台作为被管理节点,不需安装ansible

主机名IP地址节点类型系统版本
ansible-control 192.168.250.245 控制节点 centos7.8
node01 192.168.250.50 被管理节点 centos7.8
node02 192.168.250.51 被管理节点 centos7.8

2.什么是ansible

Ansible是一款自动化运维工具,基于Python开发,客户端无需安装,Ansible 使复杂的更改变得容易。它处理配置管理、应用程序部署、云配置、临时任务执行、网络自动化和多节点编排等批量任务的执行。

3.ansible有什么特点

  • 部署简单,只需在主控端部署ansible环境,被控端无需做任何操作。
  • 默认使用SSH协议对设备进行管理。
  • 有大量常规运维操作模块,可实现日常绝大部分操作。
  • 配置简单、功能强大、扩展性强。
  • 支持API及自定义模块,可通过Python轻松扩展。
  • 通过Playbooks来定制强大的配置、状态管理。
  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可。
  • 要求python的版本为2.6以上,客户端需要sshpython支持。
  • 支持Windows,但仅支持客户端,服务端必须是Linux系统。
  • 幂等性:允许重复执行N次,没有变化时,只会执行第一次。

4.怎么安装ansible

ansible只需在管理机,或者说是控制端安装,被管理端无需安装。

以上图环境为例,在CENTOS7.8的系统,ansible-control主机上安装,采用yum安装方式:

4.1检查环境

首先检查python版本,大于2.6就不需要更新python版本。

[root@ansible-control ~]# python -V
Python 2.7.5
[root@ansible-control ~]# 

CENTOS7.8默认安装Python 2.7.5python环境满足条件。

同时,检查当前系统是否存在ansible安装版本,是否需要升级:

[root@ansible-control ~]# rpm -qa | grep ansible
[root@ansible-control ~]# 

说明没有ansible或相应版本。

4.2安装epel

正式安装ansible之前,先安装第三方epel源:

[root@ansible-control ~]# yum install epel-release
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 epel-release.noarch.0.7-11 将被 安装
……
4.3安装ansible
[root@ansible-control ~]# yum install -y ansible
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * epel: mirrors.bfsu.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 ansible.noarch.0.2.9.27-1.el7 将被 安装
--> 解决依赖关系完成
……
已安装:
  ansible.noarch 0:2.9.27-1.el7                                                                                                                                                                                  

完毕!
[root@ansible-control ~]# 
4.4查看版本

安装完成后,查看当前安装的版本:

[root@ansible-control ~]# 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, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
[root@ansible-control ~]# 

当前版本为2.9.27,配置文件路径为/etc/ansible/ansible.cfg

5.ansible基本架构

Ansible 是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用 SSH 进行远程连接。无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展。

上面这张图是网上找的,很清晰,下面这张更全面:

  • 核心:ansible
  • 核心模块(Core Modules):是ansible自带的模块。
  • 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块。
  • 插件(Plugins):完成某个功能的补充。
  • 剧本(Playbooks):**ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行。**
  • 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,默认是基于SSH连接到目标机器上执行操作的,但是它还支持其他的连接方法,所以需要有连接插件,管理端支持local ssh、 paramiko三种方式连接被管理端。
  • 主机清单(Host Inventory):定义ansible管理主机。

6.ansible的7个指令

安装完ansible后,ansible一共提供了七个指令:

6.1ansible

ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。

[root@ansible-control ~]# ansible
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
               [--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts]
               [-l SUBSET] [-P POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k]
               [--private-key PRIVATE_KEY_FILE] [-u REMOTE_USER]
               [-c CONNECTION] [-T TIMEOUT]
               [--ssh-common-args SSH_COMMON_ARGS]
               [--sftp-extra-args SFTP_EXTRA_ARGS]
               [--scp-extra-args SCP_EXTRA_ARGS]
               [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
               [-e EXTRA_VARS] [--vault-id VAULT_IDS]
               [--ask-vault-pass | --vault-password-file VAULT_PASSWORD_FILES]
               [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
               [-a MODULE_ARGS] [-m MODULE_NAME]
               pattern
ansible: error: too few arguments
[root@ansible-control ~]# 
6.2ansible-doc

该指令用于查看模块信息,常用参数有两个-l  -s :查看所有已安装的模块

[root@ansible-control ~]# ansible-doc -l
fortios_router_community_list                                 Configure community lists in Fortinet's FortiOS and FortiGate                                                                                 
azure_rm_devtestlab_info                                      Get Azure DevTest Lab facts                                                                                                                   
ecs_taskdefinition                                            register a task definition in ecs                                                                                                             
avi_alertscriptconfig                                         Module for setup of AlertScriptConfig Avi RESTful Object                                                                                      
tower_receive                                                 Receive assets from Ansible Tower                                                                                                             
netapp_e_iscsi_target                                         NetApp E-Series manage iSCSI target configuration                                                                                             
azure_rm_acs                                                  Manage an Azure Container Service(ACS) instance                                                                                               
fortios_log_syslogd2_filter                                   Filters for remote system server in Fortinet's FortiOS and FortiGate                                                                          
junos_rpc                                                     Runs an arbitrary RPC over NetConf on an Juniper JUNOS device                                                                                 
na_elementsw_vlan                                             NetApp Element Software Manage VLAN           ……

查看一个模块的具体用法

[root@ansible-control ~]# ansible-doc -s shell
- name: Execute shell commands on targets
  shell:
      chdir:                 # Change into this directory before running the command.
      cmd:                   # The command to run followed by optional arguments.
      creates:               # A filename, when it already exists, this step will *not* be run.
      executable:            # Change the shell used to execute the command. This expects an absolute path to the executable.
      free_form:             # The shell module takes a free form command to run, as a string. There is no actual parameter named 'free form'. See the examples on how to use this module.
      removes:               # A filename, when it does not exist, this step will *not* be run.
      stdin:                 # Set the stdin of the command directly to the specified value.
      stdin_add_newline:     # Whether to append a newline to stdin data.
      warn:                  # Whether to enable task warnings.
[root@ansible-control ~]# 
6.3ansible-galaxy

ansible-galaxy 指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,可以形象的理解其类似于centos下的yumpython下的pipeasy_install 。

它的官方文档地址为:

https://galaxy.ansible.com/docs/using/installing.html
6.4ansible-lint

ansible-lint是对playbook的语法进行检查的一个工具。

用法:

ansible-lint  playbook.yml
6.5ansible-playbook

它是ansible的一种执行模式,一个简单的示例如下:

[root@ansible-control ~]# ansible-playbook myregister.yml -k
SSH password: 

PLAY [192.168.250.50] **********************
6.6ansible-pull

它是一种拉模式,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间。

6.7ansible-vault

ansible-vault主要应用于配置文件中含有敏感信息,又不希望被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。

主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 –ask-vault-pass参数,同样需要输入密码后才能正常执行。

7.ansible任务执行模式

ansible执行自动化任务,分为两种执行模式:

  • ad-hoc:单个模块,单条命令的批量执行,称之为ad-hoc
  • playbook:多个命令,它可以把多个想要执行的任务放到一个playbook中,通过多个任务列表可以完成一个总体的目标,这就是playbook

8.ansible配置文件

ansible的配置文件位于/etc/ansible目录下,主要有ansible.cfghosts文件。

[root@ansible-control ~]# cd /etc/ansible
[root@ansible-control ansible]# ll -sh
总用量 32K
 20K -rw-r--r--. 1 root root  20K 1月  16 2022 ansible.cfg
4.0K -rw-r--r--. 1 root root 1.1K 8月  10 12:49 hosts
4.0K -rw-r--r--. 1 root root 1.1K 8月   9 09:00 hosts.rpmsave
   0 drwxr-xr-x. 2 root root    6 1月  16 2022 roles
[root@ansible-control ansible]# 
8.1hosts文件
8.1.1查看hosts示例文件

Ex 1Ungrouped hosts, specify before any group headers.(对于未分组的主机,请在任何组头之前指定。)

green.example.com
blue.example.com
192.168.100.1
192.168.100.10

Ex 2A collection of hosts belonging to the 'webservers' group(属于“Web服务器”组的主机集合)

[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110

如果有多个主机遵循一种模式,则可以指定,比如:

www[001:006].example.com
db[a-f].haopython.com

Ex 3A collection of database servers in the 'dbservers' groupdbserver组中的数据库服务器集合)

[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57

上面的/etc/ansible/hosts文件如下:

# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

green.example.com
blue.example.com
192.168.100.1
192.168.100.10

[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110

[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
8.1.2hosts文件中的主机变量

以下是hosts部分中经常用到的变量部分:

ansible_ssh_host     #用于指定被管理的主机的真实IP
ansible_ssh_port     #用于指定连接到被管理主机的ssh端口号,默认是22
ansible_ssh_user     #ssh连接时默认使用的用户名
ansible_ssh_pass     #ssh连接时的密码
ansible_sudo_pass     #使用sudo连接用户时的密码
ansible_sudo_exec     #如果sudo命令不在默认路径,需要指定sudo命令路径
ansible_ssh_private_key_file     #秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_shell_type     #目标系统的shell的类型,默认sh
ansible_connection     #SSH 连接的类型:local , ssh , paramiko,在 ansible1.2之前默认是 paramiko ,后来智能选择,优先使用基于ControlPersist 的ssh
ansible_python_interpreter     #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl的路径
ansible_*_interpreter     #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或perl等其它语言

比如链接时ssh的密码也可以写在/etc/ansible/hosts文件中:

[webservers]
www.haopython.com http_port=80
beta.example.org   http_port=80
192.168.1.100
192.168.1.110

[webservers:vars]
http_port=80
ansible_ssh_pass='haopython999'
8.1.3hosts文件中的主机组

主机组可以包含主机组,主机的变量可以通过继承关系,继承到最高等级的组的变量。定义主机组之间的继承关系我们使用:children来表示,如下所示:

[webservers]
alpha.example.org
192.168.1.100

[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net

[allhosts:children]
webservers
dbservers
8.2ansible.cfg文件

/etc/ansible/ansible.cfg文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等。

#inventory      = /etc/ansible/hosts   该参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表 
#library        = /usr/share/my_modules/   Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录
#module_utils   = /usr/share/my_module_utils/
#remote_tmp     = ~/.ansible/tmp   指定远程执行的路径
#local_tmp      = ~/.ansible/tmp   ansible管理节点的执行路径
#forks  = 5   forks 设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管理节点的数量来确定。
#poll_interval  = 15   轮询间隔
#sudo_user      = root   sudo使用的默认用户 ,默认是root
#ask_sudo_pass = True  是否需要用户输入sudo密码
#ask_pass      = True   是否需要用户输入连接密码
#remote_port    = 22  这是指定连接对端节点的管理端口,默认是22,除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的
#module_lang    = C  这是默认模块和系统之间通信的计算机语言,默认为’C’语言.
host_key_checking = False  跳过ssh首次连接提示验证部分,False表示跳过。
#timeout = 10  连接超时时间
#module_name = command   指定ansible默认的执行模块
#nocolor = 1    默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息.如果你想关闭这一功能,可以把’nocolor’设置为‘1’:
#private_key_file=/path/to/file.pem  在使用ssh公钥私钥登录系统时候,使用的密钥路径。

原文地址:https://mp.weixin.qq.com/s/5LRUyGgWzC3dqTlv2imbGw

posted @ 2022-08-14 21:46  北极之光的博客  阅读(1332)  评论(0编辑  收藏  举报