1. python安装

1
2
3
4
5
6
- python3.10安装
# dnf install wget make gcc bzip2-devel openssl-devel zlib-devel libffi-devel -y
# wget https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz
# tar xvf Python-3.10.5.tgz
# cd Python-3.10.5
# ./configure --enable-optimizations && make -j2 && make install -j2

2. yum 安装ansible

1
2
3
4
5
6
7
8
9
10
- 更新系统
# sudo dnf update -y
- 重启系统
# sudo reboot
- 配置 EPEL 存储库
# sudo dnf install -y epel-release
- 安装 Ansible
# sudo dnf install ansible -y
- 查看 Ansible 版本
# ansible --version

3. pipenv 安装ansible

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
# 如果您正在寻找 Ansible 的最新版本,那么请使用 pip 安装 Ansible。
- 安装所有更新
# sudo dnf update -y
- 重启系统
# reboot
- 安装 python 3.9(默认已安装) 和其他依赖项
# dnf -y install python3-devel

- 安装pipenv
# pip install pipenv #pip3 install pipenv -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# pipenv --version

- 使用pipenv
# pipenv --where #查看项目位置
# pipenv --venv #查看虚拟环境位置
# pipenv --py #查看解释器信息

# pipenv shell
# pipenv graph
# pipenv uninstall 包名

- 安装 Ansible
# pip3 install setuptools-rust wheel -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# pipenv install ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

- 查看 Ansible 版本
# ansible --version

4. Ansible

4.1 常用模块

1
2
3
4
5
6
7
8
9
10
• Inventory:主机清单,根据服务器角色进行分组管理。
• Playbook:描述希望在远程服务器做哪些事的文件,采用YAML格式

常用模块:ping,command(默认),shell,yum,service,copy,user,group,file,template,unarchive,git, cron
ansible-doc –l 查看所有模块
ansible-doc –s copy 查看模块文档

command 和 shell 模块 :ansible 在远程主机执行 shell 命令,默认使用的 command 模块
文件传输(copy、file 和 synchronize) : copy 拷贝文件; file 修改文件权限 ;synchronize 增量同步
收集系统信息(setup) : setup 模块用于收集系统信息

4.2 任务控制

1
2
3
指定:ansible-playbook example.yml --tags "configuration,install"
跳过:ansible-playbook example.yml --skip-tags "install"
语法法检查:ansible-playbook main.yml --syntax-check

4.3 include & import 区别

1
2
3
4
5
6
include*(动态):在运行时导入
• --list-tags,--list-tasks不会显示到输出
• 不能使用notify触发来自include*内处理程序名称(handlers)
import*(静态):在Playbook解析时预先导入
• 不能与循环一起使用
• 将变量用于目标文件或角色名称时,不能使用inventory(主机/主机组等)中的变量

4.4 Roles目录结构

1
2
3
4
5
6
7
• tasks - 包含角色要执行的主要任务列表
• handlers - 包含角色使用的处理程序
• defaults - 角色默认的变量
• vars - 角色其他的变量
• files - 角色部署时用到的文件
• templates - 角色部署时用到的模板
• meta - 角色定义的一些元数据

4.5 什么是 Ansible facts

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
facts 是远程系统的信息,主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等信息.
默认情况下,在使用 Ansible 对远程主机执行任何一个 playbook 之前,总会先通过 setup 模块获取 facts,并暂存在内存中,直至该 playbook 执行结束。
(这意味着,想要在 playbook 中引用主机变量,至少先与该主机通信一次,以便 Ansible 能够访问其 facts,尽管有时候只需要来自该主机的少量信息)

Ansible 提供了 setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用。
如果想查看 setup 模块获取到的数据,可以在命令行上通过调用 setup 模块命令查看:
ansible all -m setup #将会返回一大大堆数据
获取这么多数据是非常耗时的,通过 time 指令可以看出,获取一台主机的 facts 数据就用了 3 秒多时间:
time ansible localhost -m setup
real 0m3.321s
user 0m1.797s
sys 0m0.205s

在被控主机较少的情况下,收集信息还可以容忍,如果被控主机数量非常大,收集 facts 信息会消耗掉非常多时间。那怎么办呢?优化 Ansible 运行速度,最简单的莫过于设置 facts 缓存了
设置 facts 缓存:我们可以设置 gather_facts: no 来禁止 Ansible 收集 facts 信息,但是有时候又需要使用 facts 中的内容,这时候可以设置 facts 的缓存。
Ansible 1.8 版本开始,引入了 facts 缓存功能。
Ansible 的配置文件中可以修改 gathering 的值为 smart、implicit 或者 explicit。
- smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts;
- implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False;
- explicit 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture。

在使用 facts 缓存时(即设置为 smart),Ansible 支持两种 facts 缓存:redis 和 jsonfile。
- 使用 redis 缓存:
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379

# 若 redis 设置了密码
# fact_caching_connection = localhost:6379:0:admin
- 使用 json 文件缓存
fact_caching = jsonfile
fact_caching_connection = /tmp/mycachedir #注意:这个目录需要是一个可读写的目录。