安装
安装要求
控制节点要求: 需要一个装有 Python 的系统
被管理节点要求: 不要求安装 Ansible, 但需要能够运行 Ansible 生成的 Python 代码
包管理器安装 Ansible
Fedora
如果觉得下载速度慢, 建议换源
dnf 包管理器换源: Fedora 软件仓库
dnf install ansible
Fedora 发行版的安装方式同样适用于 CentOS, 但需要添加 EPEL 源
CentOS Stream 9 默认启用了包管理工具 dnf,其是 yum 包管理工具的替代品。dnf 与 yum 大部分的命令都是通用的,dnf 也使用
/etc/yum.repos.d/
进行镜像配置。
配置
官方文档: 配置
配置文件为位于 /etc/ansible
下
编辑 /etc/ansible/hosts
以配置主机组:
[myhosts]
192.168.1.10
192.168.1.11
...
命令行
ad hoc command
ad hoc command 临时命令 -> 官方文档
ad hoc 特别的,专门的; 临时安排的
一个例子:
选项:
-i
指定清单文件-a
模块参数, 可以是键值对, 也可以是 json
# 列出主机组 myhosts 的家目录
ansible myhosts -i inventory.ini -a "ls ~"
inventory.ini
清单文件配置了被控制节点的 ip, 和主机组这里使用了 Ansible 的默认命令模块
ansible.builtin.command module
# -f forks
ansible myhosts -i inventory.ini -a "ls ~" -f 10
默认情况下, Ansible 只使用5个进程来执行命令, 如果你需要控制特别多的节点, 你可以通过
-f
来指定进程数, 提高命令执行效率 (减少通信所需时间)
文件操作
文件模块: ansible.builtin.file
Ansible 可以利用 scp 给为每一个节点传输文件
这里所做的是将当前控制节点的 /etc/hosts
文件复制到其它被控制节点的 /tmp
处
内置模块ansible.builtin.copy
, 可以简写为copy
, 依此类推
ansible myhosts \
-m ansible.builtin.copy \
-a "src=/etc/hosts dest=/tmp/hosts"
你还可以修改文件的权限, 属主和组:
ansible myhosts \
-m ansible.builtin.file \
-a "dest=/srv/foo/a.txt mode=600 owner=root group=root"
同样, 可以创建目录和删除目录:
ansible myhosts \
-m ansible.builtin.file \
# 创建目录 (可以忽略文件权限的设置)
-a "dest=需要创建的目录路径 state=directory mode=755 owner=mdehaan group=mdehaan"
# 删除目录
-a "dest=被删除目录的路径 state=absen"
包管理
待写...
剧本 (Playbook)
剧本采用 .yaml
文件编写, 由一个或多个 play 组成的列表
一个简单的 playbook 文件 hi.yml
:
- hosts: 主机组
remote_user: 远程用户
tasks:
- name: 任务名
command: echo hello world!
通过 ansible-playbook hi.yml
来运行 playbook
这里, task
是实际上是调用 ansible 的一个模块
核心元素:
Hosts
被控的主机列表Tasks
任务集Variable
模板Template
Handlers
与Notify
结合使用, 由特定条件触发的操作, 满足条件才执行, 否则不执行tags
为任务添加标签, 可通过标签跳过某些任务
- hosts: 主机组
# 省略一些配置...
tasks:
- name: test
ping:
- name: test2
become: yes # 默认 sudo 用户为 root
become_user: root # 设置 sudo 用户为 root
apt: name=neofetch update_cache=true
主机组的写法:
# 主机组的一些写法
one.example.com:two.example.com
192.168.233.4
192.168.233.*
group1:group2 # 两个主机组的并集
group1:&group2 # 两个主机组的交集
group1:!group2 # 在 group1 但不在 group2
常用
工具
ansible
ansible-doc
ansible-galaxy
ansible-playbook
执行 playbookansible-valut
加/解密.yml
文件ansible-console
ansible 的交互式终端
Doc
# 查看模块总结
# -s summary
ansible-doc -s command
# 查看所有模块
ansible -l
Valut
# 加密文件
ansible-vault encrypt YML文件
# 解密文件
ansible-vault decrypt YML文件
模块
ansible 有特别多的模块, 这些只是常用的:
command
模块, 默认模块 (可忽略-m
选项), 用于执行命令
该模块不支持变量,<
,>
,|
,&
,;
等符号, 由shell
模块实现shell
模块, 与command
模块相似, 但支持shell
语法Script
模块copy
与fetch
模块file
模块template
模块unarchive
和unarchive
模块setup
模块apt
模块service
模块user
模块
默认模块也可以通过修改配置 ansible.cfg
来更改
# -a [args]
ansible 主机组 -m 模块 -a 参数
command
一些参数示例:
ansible all -a "chdir=/tmp ls"
# 切换目录, 并列出文件
chdir=/tmp ls
# 如果文件存在, 则不运行
creates=/somefile.txt
# 如果文件存在, 则运行
removes=/somefile.txt
command 模块不能按预期执行很多命令, 比如 rm
shell
shell
模块与 command
模块类似
但 shell
模块支持特定的 shell 语法
ansible all -m shell -a 'echo "hello world" > hi'
script
在被控主机上运行控制主机上的脚本
# 一个例子
ansible all -m script -a "脚本路径"
copy 与 fetch
copy
模块: 将控制主机的文件复制到远程主机fetch
模块: 将被控主机的文件复制到控制主机 (不支持目录)
copy
模块使用示例:
ansible all -m copy -a "src=源路径 dest=目标路径 owner=文件属主 mode=660 backup=yes"
# 直接生成内容
content='hello\nmy friend' dest=/tmp/hi.txt
# 复制目录下的所有文件, 但不包含目录本身
"src=目录 dest=另一个目录
fetch
模块的示例:
当 fetch
模块传输完成后, 会以被控主机名来创建对应的目录, 并存放传输的文件
参数:
flat
改变文件存储的默认行为主机名/文件
, 如果设置为true
且dest
参数的末尾为/
, 则文件将直接存储到目标路径, 而不会创建主机名
的目录
ansible all -m fetch -a "src=源路径 dest=目标路径"
file
file
模块用于设置文件属性
一个例子:
# 创建空文件
ansible all -m file -a "path=/tmp/test state=touch"
# 删除文件或目录 (目录会被递归删除)
path=/tmp/test state=absent
# 设置属主和模式
path=/tmp/test owner=属主 mode=760
# 创建目录
path=/tmp/test-dir state=directory
# 创建软链接
src=/tmp/test-dir dest=/tmp/some-dir state=link
template
ansible 采用 jinja2 模块引擎来
...
unarchive 与 archive
用于解压缩:
- 可将控制主机的压缩包解压至被控主机中
- 也可对被控主机的压缩包进行解压
常用参数:
copy
默认为 yes, 将控制主机的文件复制到被控主机, no 则在被控主机寻找压缩文件remote_src
, yes 表明压缩包在被控主机上, no 则为在控制主机上; 该参数与copy
互斥src
源路径dest
目标地址
同样支持参数mode
,owner
, 等
用 tar
压缩目录:
# 先找个目录压缩
# 两个例子 (注意参数和文件后缀)
tar -zcvf test.tar.gz /tmp
tar -Jcvf test.tar.xz /tmp
.tar.xz
的压缩比大于.tar.gz
ansible unarchive
模块:
# 先将压缩包拷贝到被控主机, 然后解压
ansible all -m unarchive -a "copy=yes src=test.tar.gz dest=tmp"
# 在被控主机上寻找压缩文件, 并解压
copy=no src=test.tar.gz dest=tmp
archive
模块用于压缩文件
参数:
path
被压缩目录dest
目标路径format
压缩格式
一个示例:
# 将被控主机下的目录进行压缩
ansible all -m archive -a "path=/var/log dest=/tmp/log.tar.bz2 format=bz2"
setup
setup
模块用于收集主机系统信息
例子:
# 收集所有信息
ansible all -m setup
# 过滤数据, 只显示 ansible_lsb
ansible all -m setup -a "filter=ansible_lsb"
# 只显示发行版的主版本号
filter=ansible_distribution_major_version
apt
使用 apt
包管理器
参数:
name
就是要安装的包名update_cache
就是在操作前执行apt update
命令
ansible all -m apt -a "name=neofetch update_cache=true"
service
控制系统服务
ansible all -m service -a "name=nginx state=started enabled=yes"
?