概述
关于如何使用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学习一下。
欢迎关注课程《中小型企业通用自动化运维架构 》