Ansible-介绍和基本使用
特点
不需要在被管理节点上安装任何软件 (使用 ssh 进行控制和通信), 且可以模块化扩充 ansible 的功能.
其功能主要基于:
- API, 提供第三方程序调用接口
- Modules, 内置的模块
- Plugins, 内置, 自定义的插件
- Inventory, 主机清单
基本概念
Ansible 由三个主要部分组成:
- Control node
- Inventory
- Managed node
Control node
指安装了 ansible 的主机.
Inventory
一组 managed node 的逻辑集合. 在 control node 上创建.
Managed node
也即 “hosts”, 被管理的主机.
Playbook
一种 ansible 提供的用于自动化的简单脚本 (以 YAML 的形式).
工作流程
- 加载 ansible 配置文件
- 查找加载 inventory
- 加载对应的模块文件
- 通过 ansible 将模块生成临时的 python 文件并传输到受控节点
- 受控节点给管理节点发送过来的 python 文件添加执行权限
- 执行 python 脚本并返回结果
- 删除临时文件
Execution Environment
Execution Environment (EEs) 是把 Ansible control nodes 打包好的 containier images.
Ad hoc command
指直接通过命令快速执行的单个任务, 而无需编写完整的 playbook 如:
1 |
|
安装
一般有两个可选包:
ansible-core
, 较小, 包含 a set of Ansible.Builtinansible
, 较完整, 包含 Ansible Collections
使用 pip 安装
1 |
|
yum 安装
1 |
|
配置
配置文件被搜索的路径为:
ANSIBLE_CONFIG
ansible.cfg
(当前目录)~/.ansible.cfg
(家目录)/etc/ansiblle/ansible.cfg
配置采用 INI
格式, 有 #
, ;
两种符号用于注释, 其中只有 ;
能用于 inline. 如:
1 |
|
生成一个包含注释的配置文件
1 |
|
init
, 表明初始化一个 ansible 配置文件--disabled
, 表示生成的配置文件中所有的配置项都是被禁用的状态-t all
, 表示生成一个包含所有可用配置项的配置文件
创建 inventory
需要先确保 control node 的 public key 写入各 managed node 的 authorized_keys
中 (ssh 才可以免密登录).
- 一个 inventory 可以是
INI
或者YAML
两种格式. - 可以把 inventory 文件组织到一个目录下
- 可以用 plugin 动态获取 inventory
1 |
|
/etc/ansible/hosts
文件中有示例 inventory 编写.
在 Ansible 的 CLI 工具中, 一般用 -i <path>
来指定 inventory 文件.
编辑 inventory.ini
内容为:
1 |
|
这里创建了一个叫 myhosts
的 group.
等价的 inventory.yaml
可以为:
1 |
|
注意, group name 需要唯一且大小写敏感.
查看 inventory
1 |
|
Ping inventory 中的 myhosts group
1 |
|
Default groups
Ansible 会定义两个默认组:
- all, 包含所有 hosts
- ungrouped, 包含没有分配到 group 中的 hosts
ungrouped
如果一个 node 没有分配到任何 group 中, 在 YAML
格式下可以写为:
1 |
|
Host 位于多个 groups
示例:
1 |
|
metagroups
metagroups 可以组织多个 group, 语法为:
1 |
|
如:
1 |
|
此时:
- Child group 的成员此时也是 parent group 的成员
- Groups 可以有多个 parents 和 children
- Hosts 可以位于多个 groups 中, 但一个 host 只会有一个 instance
创建变量
1 |
|
用 .ini
文件格式写:
1 |
|
这种变量为 “组变量”, 即一个 hosts 组中的都能引用, 若为 host 变量, 如:
1 |
|
这里的 host
都是主机变量.
常见关键字
以:
1 |
|
为例.
hosts
其下有:
ansible_host
, 指定 ip 地址http_port
, 指定端口号
vars
其下的每一项都是变量.
使用 pattern 添加 hosts
这里的 pattern 和正则表达式似乎不太相同.
对数字:
1 |
|
这里的 2
是步长, 可以不指定.
对字母:
1 |
|
传入多个 inventory 文件
1 |
|
将 inventory 文件组织到目录下
若 inventory
是一个目录:
1 |
|
此时需要注意 inventory 的加载顺序, 默认是 filename 的 ASCII 顺序. Child group 的 inventory 文件需要先加载才不会报错.
可以组织为:
1 |
|
Organizing host and group variables
group_vars/
目录用于存放与特定 group 相关的变量, 文件名与 group name 相同, 这样文件中的变量会自动应用于 group 中对应的主机.
host_vars/
目录用于存放与特定 host 相关的变量, 文件名与 host name 相同, 这些变量会应用于特定主机.
注意这些变量是用于 playbook 的, 因此目录也是和 playbook 在同一目录下.
假如定义有 test
group, 则目录结构可为:
1 |
|
注意 variable 的冲突和覆盖问题.
创建 playbook
Playbook 用 YAML
的格式. 用于部署和管理 nodes.
https://github.com/ansible/ansible-examples 中包含很多 playbook 的示例.
几个概念:
- Playbook, 一系列有顺序的 plays 用于 ansible 执行
- Play, 一系列管理 inventory 中 nodes 的 tasks
- Task, 一个 module 的引用
- Module, Ansible 可以运行来管理 nodes 的 a unit of code or binary
创建一个 playbook.yaml 文件并写入内容
1 |
|
运行 playbook
1 |
|
另一个示例:
1 |
|
Playbook 可用的 keywords 可查阅 https://docs.ansible.com/ansible/latest/reference_appendices/playbooks_keywords.html#playbook-keywords.
运行顺序
默认是从上到下按顺序执行, 可以通过更改 strategies 来改变. (官方文档)
检查语法
ansible-playbook
加上 --check
, --diff
, --list-hosts
, 或 --syntax-check
参数.
Templating (Jinja2)
Templating 提供了一种利用 variables 和 facts 来生成动态表达式的方法.
示例:
1 |
|
在 templates/test.j2
文件中写有:
如果目标主机的 hostname 为 “hello” 则最后 /tmp/hostname
文件的内容为:
1 |
|
Handlers 和 Notify
notify
用于指定一个 handler 的 name
.
示例:
1 |
|
注意只有当受控节点 changed
才会触发 notify, 如:
Tags
可用于指定开始运行的位置 (从那个 task 开始):
1 |
|
之后在执行时指定:
1 |
|
Roles
命令行工具
ad hoc commands
用 /usr/bin/ansible
命令对 one or more managed nodes 运行单个 task.
语法为:
1 |
|
[module options]
为 key=value
的形式或者是 JSON string starting with {
and ending with }
.
ansible
默认调用的 module 为 ansible.builtin.command
. 但其不支持 piping 和 redirects. (若要使用这些功能则使用 ansible.builtin.shell
模块)
ansible
默认只会同时开启 5 个 simultaneous process, 如果有很多 hosts, 则不能同时运行命令, 此时可以用 -f
参数来指定.
ansible
默认用当前用户来执行命令, 若要指定其他用户, 可用 -u
参数指定.
若要以 root
用户运行, 需要加上 --become
参数. 若加上 --ask-become-pass
参数则会要求密码输入.
Rebooting servers
假设已经有 atlanta
这个 group, 则:
1 |
|
文件管理
Ad hoc command 用 SCP 传输文件. 如向 atlanta
group 传输一个文件, 使用 ansible.builtin.copy
模块:
1 |
|
修改文件 ownership 和 permission, 以及创建目录 (mkdir -p
) 用 ansible.builtin.file
模块:
1 |
|
删除文件/目录用:
1 |
|
软件包管理
可以用 ansible.builtin.yum
模块来 install, update, or remove packages on managed nodes.
安装一个软件包:
1 |
|
安装一个特定版本的软件包:
1 |
|
更新一个软件包到最新版本:
1 |
|
删除一个软件包:
1 |
|
管理用户和组
用 ansible.builtin.user
模块可以创建, 管理, 移除 user account:
1 |
|
管理服务
用 ansible.builtin.service
模块:
1 |
|
获取 managed node 的信息
用 ansible.builtin.setup
模块:
1 |
|
Check mode
ansible
命令的 -C
参数, 其不会对 managed nodes 做修改, 而是打印命令结果. 如:
1 |
|
可用命令
ansible
ansible-config
ansible-console
ansible-doc
ansible-galaxy
ansible-inventory
ansible-playbook
ansible-pull
ansible-vault
ansible-playbook
--verbose
参数可以查看详细的运行过程.
Pattern 的使用
在 ad hoc command 中应用:
1 |
|
在 playbook 中则应用于 hosts:
中:
1 |
|
常用 patterns
*
:
,,
, 指定多个, 如host1:host2
,host1,host2
!
, 排除, 如group1:!group2
&
, intersection, 如webservers:&staging
Pattern 的处理顺序
:
和,
&
!
高阶使用
需要 ansible-playbook
开启 -e
选项, 此时可以在 pattern 中使用变量, 如:
1 |
|
使用索引
索引从 0
开始, 也可以是负数, 切片:
1 |
|
使用正则表达式
需要以 ~
开头:
1 |
|
ad-hoc commands
结合 --limit
option:
1 |
|
从文件中读取 hosts 列表
用 --limit
option, 需要在文件名前加上 @
:
1 |
|
常用模块
Ansible 中的关键模块为:
- Paramike, 提供 ssh 的 python 库
- PyYAML, 处理 YAML 格式的数据
- Jinja2, 处理 template
Command
常见选项有:
chdir
cmd
(这个似乎用正在 playbook 里)creates
removes
warn
Shell
选项:
cmd
(用在 playbook 中)
Script
发送脚本到 managed nodes 上执行.
选项:
cmd
(用在 playbook 中)
Copy 和 Fetch
Copy 将 control nodes 的文件传输至 managed nodes. (支持目录)
而 Fetch 将 managed nodes 的文件传输至 control nodes. (不支持目录)
常用选项:
src
dest
content
, Copy 的选项, 不能与src
一起使用, 用于将文本复制到目标文件owner
,group
,mode
force
, 是否覆盖
File
用于文件和文件属性管理.
常用选项:
force
owner
,group
,mode
path
recurse
src
,dest
, 当state=link
时使用state
, 其值有:touch
directory
link
,hard
absent
Archive 和 Unarchive
Archive 用于打包压缩. 常用选项有:
owner
,group
,mode
format
, 默认为gz
path
exclude_path
remove
, 是否移除原文件
Unarchive 用于解压. 常用选项有:
copy
, 若为copy=yes
, 表示压缩包位于 control nodes, 若为copy=no
, 则压缩包位于 managed nodesmode
remote_src
, 同copy
, 但不能一起使用
Linefile 和 Replace
用于文件内容修改.
Linefile 常用选项:
path
line
, 替换或插入的内容regexp
insertbefore
insertafter
Replace 常用选项:
path
regexp
replace
, 替换正则表达式匹配的内容before
after
owner
,group
,mode
User 和 Group
用于管理用户和组.
User 模块的常用选项有:
name
group
, 设置主用户组groups
, 设置其他组password
home
comment
uid
Group 模块的常用选项:
gid
name
Hostname, Cron, Yum 和 Service
Hostname 用于修改 managed nodes 的主机名, 可用选项为 name
.
Cron 的常用选项有:
minute
,hour
,day
,mouth
,weekday
job
, 指定命令或脚本name
, 任务名称state
, 设置为absent
用于删除disable
,yes
启用或no
关闭
Yum 的常用选项:
name
, 包名state
,absent
为卸载,present
为安装,latest
为安装最新版本
Service 的常用选项:
name
enabled
state
,started
为开启,stopped
为关闭,restarted
为重启