Ansible-Base-1

Ansible 基础

Ansible 的依赖包说明

1
2
3
4
5
6
ansible-2.8.5-2.el8.noarch.rpm
libsodium-1.0.18-2.el8.x86 64.rpm
python3-bcrypt-3.1.6-2.el8.1.x86 64
python3-paramiko-2.4.3-1.el8.noarch.rpm
python3-pynacl-1.3.0-5.el8.x86 64.rpm
sshpass-1.06-9.el8.x86 64.rpm

注:如果你是用 yum 去安装的则不需要管包的版本依赖。

Ansible 的配置文件的查找

1. 主配置文件 ansible.cfg

参考/etc/ansible/ansible.cfg

2. Ansible 配置文件查找顺序

首先检测 ANSIBLE CONFIG 变量定义的配置文件
其次检查当前目录下的 ./ansible.cfg 文件
再次检查当前用户家目录下 ~/ansible.cfg 文件
最后检查 /etc/ansible/ansible.cfg 文件

3. ansible.cfg 配置文件(基础的列出)

1
2
3
4
5
6
7
8
9
[defaults]
# 主机清单配置文件
inventory = ~/ansible/hosts
# ssh并发数量
# forks = 5
# 使用密钥还是密码远程
# ask pass = True
# 是否校验密钥
# host key checking = False

hosts 配置主机清单(配置方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 账号密码的方式配置
# [] 代表组名
[dev_1]
192.168.10.3 ansible_host=192.168.10.3 ansible_user='root' ansible_password="Password" ansible_port='22'
192.168.10.4 ansible_host=192.168.10.4 ansible_user='root' ansible_password="Password" ansible_port='22'

# 只配置主机地址
[dev_2]
192.168.10.3
192.168.10.4

# 配置主机段
[dev_3]
192.168.10.[1:128]

# 嵌套组(children为关键字,不能更改)
# 嵌套组里面的数据为其他组名
[cluster:children]
dev_1
dev_2
ansible 查询所有主机列表
ansible all --list-hosts

Ansible ad-hoc 是一种通过命令行批量管理的方式

1
2
格式: ansible 主机集合 -m 模块名 -a "参数"
其他参数: -k 使用密码远程、-i 指定主机列表文件

注: 模块是 ansible 已经安装过的模块

Ansible 查看已存在的模块

1
2
3
4
5
6
7
8
# 查看已安装的模块
ansible-doc -l

# 过滤模块
ansible-doc -l | grep yum

# 查看指定模块的帮助信息
ansible-doc yum

Ansible 使用(command、shell)模块远程命令主机

1
2
3
4
# command 是 ansible 的默认模块
ansible dev -m command -a "uname -r"

ansible dev -m shell -a "uname -r"

command 和 shell 模块的区别

注:尽量用 shell 解释器,command 模块功能比较弱

command 的说明

1
2
command 模块的命令不启动 shell,直接通过 ssh 执行命令
command 不支持 bash 的特性,如管道和重定向等功能,所有需要调用 shell 的功能都无法使用

shell 的说明

1
2
3
shell 模块会启动 shell 执行命令
不可以使用 shell 模块执行交互命令,如 vim、top 等
退出 SSH 后所有状态失效,即切换目录的状态会被重置

shell 模块常用的一些参数

1
2
3
chdir: 切换工目录
creates: 文件存在,不执行 shell 命令
removes: 文件不存在,不执行 shell 命令
1
2
3
4
5
6
7
8
# 切换工作目录
ansible test -m shell -a "chdir=/tmp touch my.txt"

# 如果已经有密钥文件 id_rsa,则不创建密钥(skip跳过)
ansible test -m shell -a "ssh-keygen -f ~/.ssh/id_rsa -N 'Password' creates=~/.ssh/id_rsa"

# 如果没有安装 unzip 软件包,则不执行解压命令(skip跳过)
ansible test -m shell -a "unzip xx.zip removes=/bin/unzip"

script 模块(复杂命令的执行)

script 允许在本地写脚本,拷贝到被管理端并执行脚本
脚本不只是 shell 脚本 (如 python、perl 脚本等) 可以没有 -x(可执行权限)

执行案例

编写脚本

1
vim test.sh
1
2
3
4
#!/bin/bash

yum -y install httpd
systemctl start httpd

执行命令

1
ansible nodel,node2 -m script -a "./test.sh"

关于普通用户 sudo 提权的问题

sudo 的基本概念

1
2
3
4
5
6
7
sudo
superuser or another do
以超级管理员或其他人的身份执行命令
基本流程
管理员需要先授权(修改/etc/sudoers文件)
普通用户以sudo的形式执行命令
可以通过sudo -l查看授权情况

sudo 的配置

1
2
3
4
5
6
7
修改 /etc/sudoers 的方法
vi sudo (带语法检查,默认没有颜色提示)
vim /etc/sudoers (不带语法检查,默认有颜色提示)

授权格式如下:
用户或组主机列表=(提权身份) [NOPASSWD]:命令列表
命令需要写绝对路径
1
cat /etc/sudoers
1
2
3
4
5
6
...
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
# 代表用 root 用户的权限 执行 systemctl 命令
# 并且可以不用输入密码
jerry ALL=(root) NOPASSWD:/usr/bin/systemctl

ansible.cfg 配置文件对于 sudo 提权的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[defaults]
inventory = ~/ansible/hosts
# 以什么用户远程被管理主机
remote user = alice
# 是否校验密钥
# host key_checking = False
[privilege escalation)
# 是否需要切换用户
become = true
# 如何切换用户
become method = sudo
# 切换成什么用户
become user = root
# sudo 是否需要输入密码
become ask pass = no

ssh 公钥访问补充

1
2
3
4
5
6
7
8
# 生成 ssh 密钥
ssh-keygen -f /root/.ssh/id rsa -N 'password'

# 下面是密钥拷贝脚本,将密钥拷贝到多台机器上
for i in 192.168.1.2 192.168.1.3 ....
do
ssh-copy-id $i
done

Playbook

概述

1
2
3
4
5
6
7
8
9
Ansible ad-hoc 可以通过命令行形式远程管理其他主机
适合执行一些临时性简单任务

Ansible playbook 中文名称叫剧本
将经常需要执行的任务写入一个文件 (剧本)
剧本中可以包含多个任务
剧本写后,我们随时调用剧本,执行相关的任务命令
playbook 剧本要求按照 YAML 格式编写
适合执行周期性经常执行的复杂任务

yml 格式规范

1
2
3
4
5
6
7
"#" 代表注释,一般第一行为三个横杠
键值对使用 ":" 表示,数组使用 "-" 表示
缩进必须由两个或以上空格组成
相同层级的缩进必须对齐
全文不可以使用 tab 键
区分大小写、扩展名为 yml 或者 yaml
跨行数据需要使用 ">" 或者 "|" (会保留换行符)

Playbook 语法格式

1
2
3
4
5
6
7
8
9
10
playbook 采用 YAML 格式编写

playbook 文件中由一个或多个 play 组成

每个 play 中可以包含
√ hosts(主机)、tasks(任务)
√ variables(变量)、roles(角色)、handlers 等元素组成

使用 ansible-playbook 命令运行 playbook 剧本
ansible-playbook playbook_test.yml

简单案例

test.yml 剧本文件案例

1
2
3
4
5
6
7
8
9
10
11
12
13
---
# 主机组
# hosts由一个或多个组或主机组成,逗号分隔
- hosts: all
# 任务配置
# tasks由一个或多个任务组成,多个任务按顺序执行
tasks:
# 任务名称
- name: This is my first playbook
# 调用 ansible 模块
ping:
- name: Run a shell command
shell: touch ~/shell.txt

执行剧本

1
2
3
4
5
# 正常执行
ansible-playbook test.yml

# -f 选项自定义并发量
ansible-playbook test.yml -f 5
Contents
  1. 1. Ansible 基础
    1. 1.1. Ansible 的依赖包说明
    2. 1.2. Ansible 的配置文件的查找
      1. 1.2.1. 1. 主配置文件 ansible.cfg
      2. 1.2.2. 2. Ansible 配置文件查找顺序
      3. 1.2.3. 3. ansible.cfg 配置文件(基础的列出)
      4. 1.2.4. hosts 配置主机清单(配置方式)
    3. 1.3. Ansible ad-hoc 是一种通过命令行批量管理的方式
    4. 1.4. Ansible 查看已存在的模块
    5. 1.5. Ansible 使用(command、shell)模块远程命令主机
    6. 1.6. command 和 shell 模块的区别
      1. 1.6.1. command 的说明
      2. 1.6.2. shell 的说明
      3. 1.6.3. shell 模块常用的一些参数
      4. 1.6.4. script 模块(复杂命令的执行)
      5. 1.6.5. 执行案例
    7. 1.7. 关于普通用户 sudo 提权的问题
      1. 1.7.1. sudo 的基本概念
      2. 1.7.2. sudo 的配置
      3. 1.7.3. ansible.cfg 配置文件对于 sudo 提权的处理
      4. 1.7.4. ssh 公钥访问补充
    8. 1.8. Playbook
      1. 1.8.1. 概述
      2. 1.8.2. yml 格式规范
      3. 1.8.3. Playbook 语法格式
      4. 1.8.4. 简单案例
|