首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

小刘说

砥砺前行
首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • ansible简介&安装
  • ansible基础入门
    • 1. ansible目录结构
    • 2. ansible配置文件解析
    • 3. ansible命令用法
      • 3.1. 配置公私钥验证
      • 3.2. ansible命令使用
    • 4. ansible系列命令用法
      • 4.1. ansible-galaxy
      • 4.2. ansible-pull
      • 4.3. ansible-doc
      • 4.4. ansible-playbook
      • 4.5. ansible-vault
    • 5. ansible Inventory配置及详解
      • 5.1. 定义主机和组
      • 5.2. 定义主机变量
      • 5.3. 定义组变量
      • 5.4. 定义组嵌套及组变量
      • 5.5. 多重变量定义
    • 6. ansible与正则表达式
  • ansible的Ad-Hoc
  • Playbook基础入门
  • ansible进阶技巧
  • 《Ansible权威指南》
小刘
2023-02-13
目录

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
1
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
1
2
3
4
5
6

实际应用中为方便起见,一般会使用非root用户生成默认文件名为id_rsa、id_rsa.pub的密钥对,在使用时通过sudo的方式获取权限。

# 3.2. ansible命令使用

ansible命令主要在如下场景使用:

  • 非固化需求

  • 临时一次性操作

  • 二次开发接口调用

ansible的命令使用格式如下:

ansible <host-pattern> [-m 模块名称] [-a 参数] [选项]
1
选项 描述
-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
1
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] ...
1
选项 描述
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]
1

通过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
1

ansible-pull通常在配置大批量机器的场景下会使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求。

# 4.3. ansible-doc

ansible-doc是ansible模块文档说明,针对每个模块都有详细的用法说明及应用案例介绍。

# 4.4. ansible-playbook

ansible-playbook通过读取预先编写好的playbook文件实现批量管理。

命令使用方式如下:

ansible-playbook playbook.yml
1

# 4.5. ansible-vault

ansible-vault主要用于配置文件加密。

命令使用方式如下:

ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file_name
1

具体示例如下:

# 加密a.yml文件
ansible-vault encrypt a.yml
# 解密a.yml文件
ansible-vault decrypt a.yml
1
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
1
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
1
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
1
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
1
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>
1

具体示例如下:

# 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上次更新: 2024/05/11, 03:55:33

← ansible简介&安装 ansible的Ad-Hoc→

最近更新
01
kubernetes控制器-Service
08-18
02
kubernetes控制器-Deployment
08-08
03
kubernetes调度基础
07-27
更多文章>
Theme by Vdoing | Copyright © 2023-2024 本站支持IPv6访问 本站支持SSL安全访问
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式