安装

安装要求

控制节点要求: 需要一个装有 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/ 进行镜像配置。

其它 Linux 发行版的安装指导


配置

官方文档: 配置

配置文件为位于 /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
  • HandlersNotify 结合使用, 由特定条件触发的操作, 满足条件才执行, 否则不执行
  • 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 执行 playbook
  • ansible-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 模块
  • copyfetch 模块
  • file 模块
  • template 模块
  • unarchiveunarchive 模块
  • 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 改变文件存储的默认行为 主机名/文件, 如果设置为 truedest 参数的末尾为 /, 则文件将直接存储到目标路径, 而不会创建 主机名 的目录
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"
?
最后修改:2024 年 06 月 27 日
如果觉得我的文章对你有用,请随意赞赏