Ansibe 基本使用教程

概述

关于如何使用Ansible,主要分成两部分,Ansible命令行命令使用方法和如何对管理的主机进行分组,以便更好的找到被操作的机器。这两部分,对应到Ansible里的概念是Ad-hoc和Inventory。

Ansible Ad-hoc

什么是Ad-hoc

关于Ad-hoc的定义,摘自官方中文文档

(这其实是一个概念性的名字,是相对于写 Ansible playbook 来说的.类似于在命令行敲入shell命令和 写shell scripts两者之间的关系)…

如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令.

Ad-hoc结构

我们先来看一下Ansible的help message:

ansible -h
Usage: ansible  [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
  --ask-vault-pass      ask for vault password
  -B SECONDS, --background=SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes; instead, try to predict some
                        of the changes that may occur
  -D, --diff            when changing (small) files and templates, show the
                        differences in those files; works great with --check
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS
                        set additional variables as key=value or YAML/JSON
  -f FORKS, --forks=FORKS
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit
  -i INVENTORY, --inventory-file=INVENTORY
                        specify inventory host path
                        (default=/etc/ansible/hosts) or comma separated host
                        list.
.......

可以看出,Ansible一条完整的命令包括三部分:

  • ansible命令本身
  • 查找目标主机的正则
  • 对目标主机的操作

举个例子:

ansible all -m shell -a ls /root

这个例子中,all代表所有的主机,-m shell表示使用模块shell,-a ls表示给模块shell传入参数 ls,整个连起来就是,在所有主机上,执行“ls /root”命令。
如果我们相对主机做其他的操作,直接在后面增加相应的参数就可以了,比如要求输入登录密码:

ansible all -m shell -a ls /root --ask-pass

以sudo执行一条命令:

ansible all -m shell -a ls /root -s

如果sudo需要输入密码,则:

ansible all -m shell -a ls /root -s --ask-sudo-pass

Ansible Inventory

什么是Inventory

Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts,你可以通过ansible的配置文件来修改。ansible的配置文件识别顺序是:

* ANSIBLE_CONFIG (一个环境变量)
* ansible.cfg (位于当前目录中)
* .ansible.cfg (位于家目录中)
* /etc/ansible/ansible.cfg

如果没有这样的一个配置文件,你可以从这里下载一个示例,然后修改。

主机组

普通的主机组

Ansible inventory的编写规则和windows的ini文件格式一样:

192.168.1.1
[组名]
192.168.1.2
192.168.1.3

如上面的例子,Ansible可以通过192.168.1.1、192.168.1.2、192.168.1.3单独操作指定的机器,也可以通过组名来批量操作192.168.1.2和192.168.1.3两台机器,比如:

#指定host操作
ansible 192.168.1.1 -m ping
#通过组名批量操作
ansible 组名 -m ping

上面的例子是建立在host的ssh服务监听在22端口上,如果不是22端口,直接在IP后面加上端口号就可以了

192.168.1.1:6789

如果你觉着明天都输入IP或者域名太麻烦,你还可以给host起个别名:

jumper ansible_ssh_port=22 ansible_ssh_host=192.168.1.1

更多的链接参数参考官网,摘录如下:

ansible_ssh_host
  将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

ansible_ssh_port
      ssh端口号.如果不是默认的端口号,通过此变量设置.

ansible_ssh_user
      默认的 ssh 用户名

ansible_ssh_pass
      ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass
      sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)
      sudo 命令路径(适用于1.8及以上版本)

ansible_connection
      与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.

ansible_ssh_private_key_file
      ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type
      目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.

ansible_python_interpreter
      目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如  \*BSD, 或者 /usr/bin/python
      不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).

      与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

批量组机组

批量组机组就是把多个hostname或者ip相似的机器通过一行文本书写,例如:

[webservers]
www[01:50].example.com

这个规则就表示webservers这个组下面有www01.example.com到www50.example.com 50台机器。你还可以这样:

[databases]
db-[a:f].example.com

表示database组下面有 db-a.example.com到db-f.example.com 6台机器。

对于已经分好组的机器了,可以把一个组作为另一个组的子成员,例如:

[test01]
192.168.1.1
[test02]
192.168.1.2

[test]
test01
test02

这样的话,test组里就包括了test01和test02组里的所有机器。

总结

本篇文章主要讲解了ansible ad-hoc 和 inventory的基本使用方法,学会这两个功能,你基本就可以用ansible为所欲为了,当然,ansible的ad-hoc和inventory功能要比本篇文章提到的还要复杂一些,比如主机变量、动态inventory、分文件定义主机分组和主机变量等等,感兴趣的同学可以深入google学习一下。
欢迎关注课程《中小型企业通用自动化运维架构 》

点赞