Ansible ad-hoc使用方法详解

1,447 阅读7分钟

转载,原文地址:www.cnblogs.com/sxchengchen…

一、ansible介绍

1、ansible简介

官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。

Ansible跟其他IT自动化技术的区别在于其关注点并非配置管理、应用部署或IT流程工作流,而是提供一个统一的界面来协调所有的IT自动化功能,因此Ansible的系统更加易用,部署更快。

Ansible可以让用户避免编写脚本或代码来管理应用,同时还能搭建工作流实现IT任务的自动化执行。IT自动化可以降低技术门槛及对传统IT的依赖,从而加快项目的交付速度。

2、ansible架构及工作原理

andible基本架构如下图所示


  ansible core : ansible 自身核心模块

  host inventory: 主机库,定义可管控的主机列表

  connection plugins: 连接插件,一般默认基于 ssh 协议连接

  modules:core modules ( 自带模块 ) 、 custom modules ( 自定义模块 )

  playbooks :剧本,按照所设定编排的顺序执行完成安排任务

Ansible工作原理如下图:


  1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;(zeromq基于ansible带有客户端的模式)

  2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;

  3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。

Ansible默认是通过SSH通道来管理的,也就是它所说的免客户端方式管理, 它底层是通过 paramiko 来实现的。Python模块学习 - Paramiko

ansible执行过程大体过程如下图,其中暖色调的代表已经模块化。


  1.  读取配置文件 ansible.cfg
  2. 加载自己对应的模块文件,如ping
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-时间戳/XXX.py文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时py文件,sleep 0退出

二、部署安装

1、ansible安装方式有、源码、pip、yum。

1.1 源码安装

源码安装需要python2.6以上版本,其依赖模块paramiko、PyYAML、Jinja2、httplib2、simplejson、pycrypto模块,以上模块可以通过pip或easy_install 进行安装,可参考ansible源码安装

1.2 pip安装

pip是专门用来管理Python模块的工具,Ansible会将每次正式发布都更新到pip仓库中。所以通过pip安装或更新Ansible,会比较稳妥的拿到最新稳定版。可参考ansible pip安装

1.3 yum安装

1)安装epel源

yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm

2)查看epel源并安装ansible

[root@node2 ~]ll /etc/yum.repos.d/epel*
[root@node2 ~]yum install ansible -y

3)查看ansible版本

ansible --version

2 ansible组成介绍

tree /etc/ansible/
/etc/ansible/
├── ansible.cfg  # ansible的配置文件
├── hosts  # ansible的主仓库 用来存储需要管理的远程主机的相关信息
└── roles

3、ansible七个命令

ansible

常用参数:

-m 模块

-i PATH, --inventory=PATH 指定库存主机文件的路径,默认为/etc/ansible/hosts.

-a (arguments) 命令行参数

ansible-doc

//列出所有已安装的模块

# ansible-doc  -l

//查看具体某模块的用法,这里如查看command模块

# ansible-doc -s command

absible-galaxy

ansible-galaxy 指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip或easy_install 。

ansible-lint

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

ansible-playbook

该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作。

ansible-pull

适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间;你要在一个没有网络连接的机器上运行Anisble,比如在启动之后安装。

ansible-vault

目前主要使用为isib的hosts文件加密

注意:加密文件需要增加配置ask_vault_pass = false

加密文件配置为vault_password_file = /filedirectory/file

注意:重点是ansible和ansible-playbook

4、主机组(在hosts文件内配置)

5、ansible默认配置文件

Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg

ansible简单使用

[root@test ansible]# ansible test1 -m ping -k
SSH password:

192.168.147.101 | FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

报错处理办法:

在ansible.cfg配置文件中,也会找到如下部分:

# uncomment this to disable SSH key host checking
host_key_checking = False

默认host_key_checking部分是注释的,通过找开该行的注释,同样也可以实现跳过 ssh 首次连接提示验证部分。

可见采用密码方式比较麻烦,实际应用中采用ssh 互信方式。

配置ssh 互信时,只需要管理主机能ssh被管理机器不需要输入密码即可。

三、ansible常用模块

3.1、ping

ansible test1 -m ping

3.2、setup

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下:

#查看主机内存信息

[root@test ~]# ansible test1 -m setup -a 'filter=ansible_*_mb'

#查看网卡信息

[root@test ~]# ansible test1 -m setup -a 'filter=ansible_eth0'

#将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)

[root@test ~]# ansible all -m setup --tree /tmp/facts

3.3 copy模块

  • backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
  • content:用于替代"src",可以直接设定指定文件的值
  • directory_mode:递归的设定目录的权限,默认为系统默认权限
  • force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
  • others:所有的file模块里的选项都可以在这里使用
  • src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

示例:

[root@test ~]# ansible test1 -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt owner=foo group=foo mode=0644"

3.4 command 模块

  • creates:一个文件名,当该文件存在,则该命令不执行
  • free_form:要执行的linux指令
  • chdir:在执行指令之前,先切换到该指定的目录
  • removes:一个文件名,当该文件不存在,则该选项不执行
  • executable:切换shell来执行指令,该执行路径必须是一个绝对路径

注意:command模块不是调用的shell的指令,所以没有bash的环境变量,也不能使用shell的一些操作方式,其他和shell没有区别,无法识别特殊字符,如管道符等

示例:

[root@test ansible]# ansible test1 -a 'df -h'

3.5 shell 模块

用法其本和command一样,不过的是其是通过/bin/sh进行执行,所以shell 模块可以执行任何命令,就像在本机执行一样。

示例:

[root@test ansible]# ansible test1 -m shell -a 'ps -ef | grep sshd'

3.6 script 模块

将管理端的shell 在被管理主机上执行,其原理是先将shell 复制到远程主机,再在远程主机上执行,原理类似于raw模块。

[root@test ansible]# ansible test1 -m script -a "/home/test.sh"