ansible的介绍和安装

ansible的介绍和安装

 

ansible基于python开发的一种简单的自动化IT工具,能够实现批量系统配置、部署、运行命令等功能。无需agent端,因为它是基于ssh来运行。

 

对于saltstack和puppet来说,它是一款很好的基于ssh方案的替代品,能够大大地简化Linux管理员的自动化配置管理与流程控制方式,它利用推送的方式对客户端系统加以配置,这样所有的工作都可以在主控制端完成,其命令机制同样非常强大,可以使用Web UI实现授权管理与配置。

 

性能特性总结:

 

它是基于Python语言实现,通过ssh进行管理节点,无需agent端,使用起来很方便。

Ansible巧妙地利用了现有的组件进行组装称一个完整的系统,如:

 

1.Paramiko组件(python的ssh连接库)

 

2. PyYAML组件(python的YAML解析器库)

 

3.Jinja2组件(Python的模板引擎库)

 

 

受控节点如果是Python 2.4 或 Python 2.5 ,则需额外安装Simplejson模块。到Python的2.6或以上版本,就则内置了Simplejson模块,不需要额外安装任何其它依赖。值得欣慰的是,目前主流的服务器上内置的Python版本绝多数都是Python 2.6以上版本。

 

Anshible的核心组件

 

Ansible在管理节点将ansible模块通过ssh协议(或者kerberos、LDAP)推送到被管理端执行,执行完之后自动删除,可以使用SVN等来管理自定义模块及编排。

 

Host Inventory: 自定义ansible管理主机,可以进行分组管理,对应的文件是hosts;

 

Core Modules : ansible核心模块,ansible中模块就是用来指定对远程主机具体的操作,比如,执行命令模块command、创建文件模块file等(这是ansible自带的模块)

 

Custom Modules:自定义模块,如果核心模块不足以完成某种功能就可以使用任何语言自定义模块;

 

Connection Plugins:连接插件是ansible用来连接被管理端的一种方式,比如客户端运行了SSH服务,ansible利用ssh服务跟客户端通信,ansible是通过python编写的,而python有一个paramiko支持并行连接ssh,ansible事实上就是使用paramiko进行连接被管理管,但是它还支持其他的连接方法,但是需要插件(如zeroMQ就是C/S模式工作)

 

Plugins:第三方插件支持,如Email、logging模块,只要有python编写能力就可以自行编写插件;

Playbooks: 剧本或编辑是ansible的任务配置文件、将多个任务定义在剧本中有ansible自动执行,Playbooks最大的好处就是支持幂等,也就是说相同的任务不管执行对少次其结果是不变的,带来的好处就是持续可维护性;

 Anshible的安装

 一、yum或apt安装

 二、python安装

 三、源码包安装

 Ansible文件说明:

 [root@bogon ~]# rpm -ql ansible|more

/etc/ansible

/etc/ansible/ansible.cfg 主配置文件

/etc/ansible/hosts 默认定义主机清单文件

/etc/ansible/roles 用来编排Playbook

 Ansible模块使用帮助命令,其中使用-l可以查看ansible自带的模块

/usr/bin/ansible-doc

/usr/bin/ansible-galaxy

/usr/bin/ansible-inventory

 用来执行playbook的程序

 /usr/bin/ansible-playbook

/usr/bin/ansible-pull

/usr/bin/ansible-vault

 Ansible开始简单实用

 ansible -i /etc/ansible/host all [options]

 其中 -i 用来指定inventory文件,默认就是使用/etc/ansible/hosts,其中all是针对hosts定义的所有主机执行,这里也可以hosts中地址的组名或模块

 [options]

 -m:指定模块(默认是command模块)

-a: 指定模块的参数

-u:指定执行远程主机的用户(默认是root)ansible.cfg中可配置

-s:以sodu方式运行

-U:sudo到哪个用户(默认是root用户)

-f:指定多个进程并发处理(默认是5)

--private-key=/path:指定私钥路径

-T:ssh连接超时时间(默认10秒)

-t:日志输出到该目录

-v:显示详细信息

 

开始使用ansible

 1)定义Inventory

 Inventory文件是用来定义要管理的主机,默认位置在/etc/ansible/hosts,如果不保存在默认位置,也可以使用-i选项指定,被管理的机器可以通过其ip或域名指定。每个中括号[ ]里代表一个分组,其下的机器列表都归属这个分组,直到出现下一个中括号位置,通常我们按组来执行任务,同一个组受控服务器用相同的配置,一台服务器也可以归属多个组,以完成多个功能角色的配置,低耦合,模块化,非常的灵活,如定义一个分组[web],并给定一台主机:

cat /etc/ansible/hosts

[web]

192.168.20.55 ansible_ssh_user="root" ansible_ssh_pass="111111"

 2)执行ansible的命令

 配置好主机列表之后就可以开始执行批量任务,ansible自带了ping模块,可以测试“管理节点”和“受控节点”之间的网络通讯情况;

 Linux服务器均使用SSH进行远程管理,SSH服务是服务器必备组件,Ansible在设计上见话是用成本,在“管理节点”上使用SSH连接“受控节点”,通过创建SSH连接来发送指使并执行,达到配置管理的目的,这样避免了不同版本的操作系统、甚至不同发行版本的操作系统下使用agent带来的兼容性问题。

 首先,ansible测试管理节点和受控节点的网络通讯情况:

 不使用免密钥的时候则安装sshpass

 centos使用yum安装

 ubuntu使用apt-get安装

 

 或者:

 

 

注意,如果是第一次使用SSH连接agent端,那么就不能使用-k了,要先进行公钥保存确认,然后再使用-k连接,

 

ansible第一次远程连接agent端的时候,agent端先安装apt -y install python-minimal,再执行ansible命令

如:

 如果出现这样的错误时则操作下面的步骤:

远程端:

 

 服务端:

 

 如果使用密钥方式登陆SSH,去掉-k参数即可,可以为Ansible设置一个特定的用户,所有操作均以此用户来执行,甚至可以为每个“受控节点”设置各自不同的用户

 

全局用户的设置见配置文件/etc/ansible/ansible.cfg,修改[defaults]段落里的remote_user的值即可,也可以通过修改remote_port来定义Ansible去使用非标准的22/SSH端口来进行连接和管理,在没有给“受控节点”或“受控组”进行特定设置时,Ansible将默认使用全局设置。

 cat /etc/ansible/ansible.cfg

 

 3)Inventory格式的编写

 Ansible通过读取默认的主机清单配置/etc/ansible/hosts,可以同时连接到多个远程主机上执行任务,默认路径可以通过修改ansible.cfg的hostfile参数地址路径,主机清单配置格式如下:

 # 指定IP地址并且支持通配;

[web1]

192.168.20.16

192.168.20.[1-9]

 

# 指定IP加端口;

[web2]

192.168.20.1:5252

 

# 指定域名,必须可以解析;

[web3]

www.example.com

 # 组嵌套,当执行组[weball]时就会执行它的所有子组但是子组可以独立执行;

[weball:children]

[web1]

[web2]

[web3]

 

另外可以通过设置ansible_ssh_user来指定用户在“受控节点”上执行的任务,还可以通过设置ansible_ssh_host来指定不同主机或域名,SSH对应的端口也可以通过ansible_ssh_port来修改,同时还能使用特定的密钥登陆。

 常用参数如下:

 ansible_connection=ssh #指定连接类型,可以使local、ssh、paramiko;

ansible_ssh_user=root #用于指定远程主机的账号;

ansible_ssh_pass=password #指定连接到主机的密码连-k都省了;

ansible_ssh_port=23 #用于指定远程主机SSH端口;

ansible_ssh_privare_key_file=/PATH #用于指定key文件;

host_key_checking=false #当第一次连接远程主机,跳过yes/no环节;

ansible_shell_type #指定目标系统的shell(默认为sh);

ansible_python_interpreter=/ #指定Python解释器路径(默认/USR/BIN/PYTHON);

  

配置示范:

cat /etc/ansible/hosts

 

管理节点操作:

 可能有些场景下,执行配置管理需要用root权限。但由于安全原因,可能会限制root使用SSH登录。比如:Ubuntu系统默认就不能使用 root 直接SSH登录系统。Ansible设计时也考虑到此类场景,这种情况下我们只需要告诉Ansible使用sudo的方式执行那些需要 root 权限的配置任务。前提条件是执行Ansible任务的用户需要有sudo的权限。要设定Ansible使用sudo,执行Ansible的任务的用户必须要有sudo权限。可以通过修改/etc/sudoers文件或visudo命令来完成,或者直接使用现在符合条件的用户。参数-sudo即告诉Ansible使用sudo来运行任务,如果sudo需要密码,则需要添加-k参数,或者在配置文件/etc/ansible/ansible.cfg中添加ask_sudo_pass的属性。

 Ansible使用键值方式接受参数,即传统的KV方式(key=value)。每次执行任务后,将以JSON格式返回结果。它可以解析复杂的参数,或者用playbooks方式(后面会讲解)。Ansible返回会明确指明运行是否成功、是否有变动以及失败时的错误信息。

 通常都用playbooks的方式来执行Ansible任务,少数情况下使用命令行模式运行。过去,我们用Ansible的ping模块来检查“受控节点”是否正常受控。而实际上,ping模块仅仅执行了Ansible最核心的功能并检查了网络联通性,并未做其它实际性动作。

 通常都用playbooks的方式来执行Ansible任务,少数情况下使用命令行模式运行。过去,我们用Ansible的ping模块来检查“受控节点”是否正常受控。而实际上,ping模块仅仅执行了Ansible最核心的功能并检查了网络联通性,并未做其它实际性动作。

 进而产生了setup模块,它不仅可以反馈“受控节点”的可用性,还会收集一些系统信息以供其它模块使用。Setup 模块定义了一系列的采集指令,比如:内核版本、机器名、IP地址等等,并将这些信息保存在内置变量,其它模块再执行任务时可以直接引用或用于判断条件等。

 主机变量和组变量

 Inventory除了上述的基本功能外,还可以在主机后面定义变量以便于在playbook中使用,例:

 

 

不光对主机可以定义变量,对组也可以定义变量。组变量是指赋予给组内所有主机,都可以在playbook中使用,格式如下:

 

 这就是针对web01组设置的组变量,:vars是固定格式,组内的所有变量都可以给组内的主机使用。

 常用模块的介绍:

 根据Ansible官方的分类,将模块分为核心模块和额外模块;

 核心模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块等。

 具体可以参看官方页面ansible-modules-core。这里从官方分类的模块里选择最常用的一些模块进行介绍,介绍之前我们先调整一下hosts文件,把默认用户和密码添加到主机中,这样就不需要指定-u及-k了

posted @ 2019-11-28 20:18  迷路的大雁  阅读(340)  评论(0编辑  收藏  举报