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 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 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
|