ansible基础入门
# ansible基础入门
# 1. ansible目录结构
# 2. ansible配置文件解析
Ansible的自身配置文件只有一个,即ansible.cfg
,Ansible安装好后它默认存放于/etc/ansible/
目录下。ansible.cfg
配置文件可以存在于多个地方,Ansible读取配置文件的顺序依次是:
当前命令执行目录→用户家目录下的.ansible.cfg
→/etc/ansible.cfg
,先找到哪个就使用哪个。
ansible.cfg
配置文件示例:
# 该类配置下定义常规的连接类配置。
[defaults]
# inventory = /etc/ansible/hosts # 定义Inventory
# library = /usr/share/my_modules/ # 自定义lib库存放目录
# remote_tmp = $HOME/.ansible/tmp # 临时文件远程主机存放目录
# local_tmp = $HOME/.ansible/tmp # 临时文件本地存放目录
# forks = 5 # 默认开启的并发数
# poll_interval = 15 # 默认轮询时间间隔
# sudo_user = root # 默认sudo用户
# ask_sudo_pass = True # 是否需要sudo密码
# ask_pass = True # 是否需要密码
# roles_path = /etc/ansible/roles # 默认下载的Roles存放的目录
# host_key_checking = False # 首次连接是否需要检查key认证,建议设为False
# timeout = 10 # 默认超时时间
# log_path = /var/log/ansible.log # 执行日志存放目录
# module_name = command # 默认执行的模块
# action_plugins = /usr/share/ansible/plugins/action # action插件的存放目录
# callback_plugins = /usr/share/ansible/plugins/callback # callback插件的存放目录
# connection_plugins = /usr/share/ansible/plugins/connection # connection插件的
# 存放目录
# lookup_plugins = /usr/share/ansible/plugins/lookup # lookup插件的存放目录
# vars_plugins = /usr/share/ansible/plugins/vars # vars插件的存放目录
# filter_plugins = /usr/share/ansible/plugins/filter # filter插件的存放目录
# test_plugins = /usr/share/ansible/plugins/test # test插件的存放目录
# strategy_plugins = /usr/share/ansible/plugins/strategy # strategy插件的存放目录
# fact_caching = memory # getfact缓存的主机信息存放方式
# retry_files_enabled = False
# retry_files_save_path = ~/.ansible-retry # 错误重启文件存放目录
# 该部分配置主要针对sudo用户提权的配置。
[privilege_escalation]
# become=True # 是否sudo
# become_method=sudo # sudo方式
# become_user=root # sudo后变为root用户
# become_ask_pass=False # sudo后是否验证密码
# 主要是SSH连接的一些配置。
[ssh_connection]
# pipelining = False # 管道加速功能,需配合requiretty使用方可生效
# ansible连接加速相关配置。该配置项在提升Ansibile连接速度时会涉及,多数保持默认即可。
[accelerate]
# accelerate_port = 5099 # 加速连接端口
# accelerate_timeout = 30 # 命令执行超时时间,单位秒
# accelerate_connect_timeout = 5.0 # 连接超时时间,单位秒
# accelerate_daemon_timeout = 30 # 上一个活动连接的时间,单位分钟
# accelerate_multi_key = yes
# 配置输出结果的颜色。几乎不用修改。
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 3. ansible命令用法
ansible的通信默认基于SSH,因此我们需要对主机先进行认证。ansible认证方式有密码认证和公私钥认证两种方式。这里采用公私钥验证方式进行配置示范。
# 3.1. 配置公私钥验证
# 随机生成公私钥对,ssh-keygen是Linux下认证密钥生成、管理和转换工具,详细用法可参考其man文档
ssh-keygen -N "" -b 4096 -t rsa -f /root/.ssh/ansible.rsa
# 为本机添加密钥认证
ssh-copy-id -i /root/.ssh/ansible.rsa root@localhost
# 输入如下命令尝试免密码登录
ssh -i /root/.ssh/ansible.rsa root@localhost
2
3
4
5
6
实际应用中为方便起见,一般会使用非root用户生成默认文件名为id_rsa
、id_rsa.pub
的密钥对,在使用时通过sudo
的方式获取权限。
# 3.2. ansible命令使用
ansible命令主要在如下场景使用:
非固化需求
临时一次性操作
二次开发接口调用
ansible的命令使用格式如下:
ansible <host-pattern> [-m 模块名称] [-a 参数] [选项]
选项 | 描述 |
---|---|
-a '参数' | 需要传递给模块的参数。 |
-b | 以更高权限运行命令。(默认为root) |
--user=username | 使用此username进行连接主机。 |
--become-user=username | 指定主机以username运行命令。 |
-C | 模拟真实的运行情况在主机上,但是不对主机进行更改内容。 |
-m module | 指定运行模块的名称。 |
具体示例如下:
# 列出all组下的所有主机
ansible all --list-hosts
# 以root用户执行ping存活检测
ansible all -m ping --user=root
# 以ansible用户sudo至root执行ping存活检测
ansible all -m ping --user=ansible -b
# 以root用户sudo至ansible用户执行ping存活检测
ansible all -m ping --user=root -b --become-user=ansible
2
3
4
5
6
7
8
# 4. ansible系列命令用法
# 4.1. ansible-galaxy
ansible-galaxy
的功能可以简单地理解为GitHub
或PIP
的功能,通过ansible-galaxy
命令,我们可以根据下载量和关注量等信息,查找和安装优秀的Roles
。
在ansible-galaxy
上,我们可以上传和下载Roles
,这里也是优秀Roles
的聚集地,下载地址为https://galaxy.ansible.com (opens new window) 。
ansible-galaxy命令使用格式如下:
ansible-galaxy [init|info|install|list|remove] [--help] [options] ...
选项 | 描述 |
---|---|
init | 初始化本地的Roles配置,以备上传Roles至galaxy。 |
info | 列表指定Role的详细信息。 |
install | 下载并安装galaxy指定的Roles到本地。 |
list | 列出本地已下载的Roles。 |
remove | 删除本地已下载的Roles。 |
# 4.2. ansible-pull
该指令的使用涉及Ansible的另一种工作模式:pull模式(Ansible默认使用push模式)。这和通常使用的push模式工作机理刚好相反,其适用于以下场景:
- 你有数量巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间。
- 你要在刚启动的、没有网络连接的主机上运行Ansible。
ansible-pull命令使用格式如下:
ansible-pull [options] [playbook.yml]
通过ansible-pull结合Git和crontab一并实现,其原理如下:通过crontab定期拉取指定的Git版本到本地,并以指定模式自动运行预先制订好的指令。 具体示例参考如下:
*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts -U git:// git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1
ansible-pull通常在配置大批量机器的场景下会使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求。
# 4.3. ansible-doc
ansible-doc
是ansible
模块文档说明,针对每个模块都有详细的用法说明及应用案例介绍。
# 4.4. ansible-playbook
ansible-playbook
通过读取预先编写好的playbook
文件实现批量管理。
命令使用方式如下:
ansible-playbook playbook.yml
# 4.5. ansible-vault
ansible-vault主要用于配置文件加密。
命令使用方式如下:
ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file_name
具体示例如下:
# 加密a.yml文件
ansible-vault encrypt a.yml
# 解密a.yml文件
ansible-vault decrypt a.yml
2
3
4
# 5. ansible Inventory配置及详解
Inventory
是ansible
管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts
。可以在使用时通过–i
或--inventory-file
指定读取对应的Inventory
文件。
# 5.1. 定义主机和组
# Inventory可以直接为IP地址
192.168.37.149
# Inventory同样支持Hostname的方式,后跟冒号加数字表示端口号,默认22号端口
ntp.magedu.com:2222
nfs.magedu.com
# 中括号内的内容表示一个分组的开始,紧随其后的主机均属于该组成员,空行后的主机亦属于该组
[websevers]
web1.magedu.com
web2.magedu.com
# [10:20]表示10~20之间的所有数字(包括10和20),即表示web10.magedu.com、web11.magedu.com……web20.magedu.com的所有主机
web[10:20].magedu.com
[dbservers]
db-a.magedu.com
# [b:f]表示b到f之间的所有数字(包括b和f),即表示db-b.magedu.com、db-e.magedu.com……db-f.magedu.com的所有主机
db-[b:f].magedu.com
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 5.2. 定义主机变量
在定义主机时为其添加主机变量,以便在Playbook
中使用针对某一主机的个性化要求。
[webservers]
# 自定义http_port的端口号为808,配置maxRequestsPerChild为801
web1.magedu.com http_port=808 maxRequestsPerChild=801
2
3
# 5.3. 定义组变量
赋予指定组内所有主机在Playbook
中可用的变量。
[groupservers]
web1.magedu.com
web2.magedu.com
# 定义groupservers组中所有主机ntp_server值为ntp.magedu.com
[groupservers:vars]
ntp_server=ntp.magedu.com
2
3
4
5
6
# 5.4. 定义组嵌套及组变量
组还可以包含其他的组(嵌套),并且也可以向组中的主机指定变量。这种方式在业务日常使用中并不常见,大家了解其用法即可。
[apache]
httpd1.magedu.com
httpd2.magedu.com
[nginx]
ngx1.magedu.com
ngx2.magedu.com
[webservers:children]
apache
nginx
[webservers:vars]
ntp_server=ntp.magedu.com
2
3
4
5
6
7
8
9
10
11
12
13
14
# 5.5. 多重变量定义
变量也可以独立于Inventory
文件之外单独存储到YAML
格式的配置文件中。
ansible
会按照下列路径来寻找配置文件:
路径名 | 备注 |
---|---|
/etc/ansible/hosts | Inventory配置文件 |
Playbook中vars定义的区域 | |
Roles中vars目录下的文件 | |
Roles同级目录group_vars和hosts_vars目录下的文件 |
# 6. ansible与正则表达式
其Patterns功能等同于正则表达式,语法使用也和正则类同,该功能同样支持Ansible-playbook。
命令使用格式如下:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
具体示例如下:
# all和*功能相同,但*号需引起来
ansible all –m ping
ansible "*" -m ping
# 需要同时对多台主机或多个组同时执行,相互之间用“:”(冒号)分隔
ansible "web1:web2" -m ping
# 逻辑非用感叹号(!)表示,针对多重条件的匹配规则,如:所有在webservers组但不在phoenix组的主机
ansible "webservers:!phoenix" -m ping
# 逻辑与(&),如:webservers组和staging组中同时存在的主机
ansible "webservers:&staging" -m ping
# 多条件组合:多条件的复杂组合,使用频率不高,如:webservers和dbservers两个组中的所有主机在staging组中存在且在phoenix组中不存在的主机
ansible "webservers:dbservers:&staging:!phoenix" -m ping
# Python字符串域切割:底层基于Python,因此也支持域切割。
ansible "webservers[0]" -m ping
ansible "webservers[0:2]" -m ping
# 完整支持正则匹配:“~”开始表示正则匹配。如:检测Inventory中所有以192.168开头的服务器存活信息
ansible ~192\.168\.[0-9]\{\2}.[0-9]\{2,} -m ping
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16