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
以上,客户端需要ssh
和python
支持。 - 支持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.5
,python
环境满足条件。
同时,检查当前系统是否存在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
下的yum
、python
下的pip
或easy_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.cfg
、hosts
文件。
[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 1: Ungrouped hosts, specify before any group headers.
(对于未分组的主机,请在任何组头之前指定。)
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
Ex 2: A 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 3: A collection of database servers in the 'dbservers' group
(dbserver
组中的数据库服务器集合)
[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