前言
Ansible是一个开源的自动化工具,用于配置管理、应用部署、任务执行,以及用于IaaS云中临时的基础设施的转配。Ansible使用SSH进行通信,因此无需在目标服务器上安装代理。 官网:https://www.ansible.com/ 官方文档:https://docs.ansible.com/ 特点:
- 模型驱动:Ansible使用模块化架构,通过定义任务的简单语言来描述配置。
- 无代理:Ansible通过SSH与远程机器通信,无需在目标系统上安装额外的软件。
- 推模式:Ansible使用推模式,意味着它有一个中央控制节点,用于发送命令到远程节点。
- 易于使用:Ansible的语法简单,使用YAML格式编写剧本(playbooks),易于理解和编写。
- 并行执行:Ansible支持多核执行,可以并行地在多个系统上运行任务。
- 错误处理:提供错误处理机制,允许在出现错误时继续执行其他任务或停止执行。
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
安装ansible
1.yum安装
[root@xyy2 ~]# yum install git #git安装
[root@xyy2 ~]# git clone git://github.com/ansible/ansible.git --recursive
#git clone +远程存储库地址 克隆远程存储库
[root@xyy2 ~]# cd /etc/yum.repos.d/
[root@xyy2 yum.repos.d]# vim CentOS-Base.repo
[epel]
name=gn
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
https://mirrors.cloud.tencent.com/epel/$releasever/x86_64
https://mirrors.huaweicloud.com/epel/$releasever/x86_64
https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/x86_64
gpgcheck=0
[root@xyy2 yum.repos.d]# yum info ansible #显示ansible可用包的信息
[root@xyy2 yum.repos.d]# yum install epel-release.noarch -y #安装epel源
[root@xyy2 yum.repos.d]# yum install ansible -y #安装ansible
[root@xyy2 yum.repos.d]# rpm -qc ansible #显示配置文件
/etc/ansible/ansible.cfg
/etc/ansible/hosts
版本显示:
[root@xyy2 yum.repos.d]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
2.ubantu上安装
root@uxyy:/home/xy# apt update #从apt repository中下载新版本的apt包,然后将其应用到系统上
root@uxyy:/home/xy# apt install software-properties-common
root@uxyy:/home/xy# apt-add-repository --yes --update ppa:ansible/ansible
root@uxyy:/home/xy# apt install ansible #安装ansible
配置文件说明
- /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件
- /etc/ansible/hosts 主机清单
- /etc/ansible/roles/ 存放角色的目录
1.主配置文件
主配置文件生效优先级
./ansible.cfg #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg #系统默认配置文件
】
[default]
inventory = /etc/ansible/hosts #主机列表配置文件
library = /usr/share/my_modules/ #库文件存放目录 搜索模块使用
remote_tmp = ~/.ansible/tmp #临时py命令文件存放在远程主机目录
local_tmp = ~/.ansible/tmp #临时文件本地主机存放目录
forks = 5 #默认并发数
poll_interval = 15 #默认轮询间隔时间,单位秒
sudo_user = root #被控端默认执行sudo命令所切换的用户
ask_sudo_pass = True #每次执行sudo命令时是否询问sudo到目标用户的密码
ask_pass = True #每次执行ansible命令是否询问ssh密码
transport = smart #通信机制
remote_port = 22 #远程连接被控端的ssh端口
module_lang = C #模块和系统之间通信的语言,默认为C语言
gathering = implicit #控制默认facts收集,远程系统变量
roles_path = /etc/ansible/roles #角色存储路径
host_key_checking = False #是否检查远程主机密钥
sudo_exe = sudo #sudo远程执行命令
sudo_flags = -H -S -n #传递sudo之外的参数
timeout = 10 #SSH超时时间
remote_user = root #指定默认的远程连接用户
log_path = /var/log/ansible.log #ansible日志文件,执行ansible的用户需要对日志文件具有写入权限
module_name = command #ansible默认执行的模块 建议修改为shell
executable = /bin/sh #执行的shell环境,用户shell模块
hash_behaviour = replace #如果变量重叠,优先级更高的一个是替换优先级低得还是合并在一起,默认为替换
private_role_vars = yes #默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
private_key_file = /path/to/file #私钥文件存储位置
command_warnings = False #command模块Ansible默认发出警告
nocolor = 1 #ansible输出带上颜色区别,0表示开启,1表示关闭
pipelining = False #开启pipe ssh通道优化
[privilege_escalation]
#出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置
become=True #是否sudo
become_method=sudo #sudo方式
become_user=root #sudo后变为root用户
become_ask_pass=False #sudo后是否需要验证密码
[paramiko_connection]
pty=False #是否禁用sudo功能
[ssh_connection] #ansible默认使用SSH协议连接对端主机,该部署是主要是SSH连接的一些配置,但配置项较少,多数默认即可
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s #ssh连接时的参数
pipelining = False #SSH pipelining 是一个加速 ansible 执行速度的简单方法。ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 ansible 执行没有传输时 ssh 在被控机器上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项
scp_if_ssh = smart #该项为True时,如果连接类型是ssh,使ansible使用scp,为False是,ansible使用sftp。默认为smart,smart为先尝试sftp,然后尝试scp
[persistent_connection] #持续连接
connect_timeout = 30 #ansible如果在30秒内没有收到请求,则关闭连接,默认为30秒
command_timeout = 30 #ansible执行命令如果在30秒内没有收到回应则认为命令超时
[accelerate] #缓存加速
accelerate_port = 5099 #加速连接端口5099
accelerate_timeout = 30 #命令执行超时时间
ccelerate_connect_timeout = 5.0 #连接超时时间,单位为秒
accelerate_daemon_timeout = 30 #上一个活动连接的时间,单位为分钟
accelerate_multi_key = yes #允许多个私钥被加载到daemon
[selinux]
special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p #文件系统在处理安全上下文时需要特殊处理,定义复制现有上下文的文件系统
libvirt_lxc_noseclabel = yes #将此设置为yes,以允许libvirt_lxc连接在没有SELinux的情况下工作
[colors]
#Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。
highlight = white
verbose = blue
warn = bright purple
error = red
debug = dark gray
deprecate = purple
skip = cyan
unreachable = red
ok = green
changed = yellow
diff_add = green
diff_remove = red
diff_lines = cyan
[diff]
always = no
context = 3
2.inventory 主机清单文件
定义了Ansible控制节点管理的主机列表 ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织 官方文档: https://docs.ansible.com/ansible/latest/userguide/introinventory.html
位置:/etc/ansible/hosts
ansible_ssh_host
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222
ansible_ssh_user
#默认的 ssh 用户名
ansible_ssh_pass
#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适用于1.8及以上版本)
ansible_connection
#与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
#ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为'csh' 或 'fish'.
ansible_python_interpreter
#目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
示例:
[local]
192.168.64.18 ansible_connection=local
[web]
192.168.64.15
192.168.64.16
[accp]
192.168.64.10
192.168.64.11
[webserver]
192.168.64.[15:16]
192.168.64.11
[web:children]
web
accp
#以上都可以
[root@xyy2 ansible]# ansible 192.168.64.15 -m ping #用ansible执行icmp
192.168.64.15 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Warning: Permanently added '192.168.64.15' (ECDSA) to the lisr\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
#会报错
vim /etc/ssh/ssh_config
# StrictHostKeyChecking ask
# 修改35行 StrictHostKeyChecking no
#vim /etc/ansible/ansible.cfg
71 #host_key_checking = False
开启71行的ansible的不验证即可
免密登录脚本:
PASS=123
#设置网段最后的地址,4-255之间,越小扫描越快
END=20
IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
#服务器密码统一 才能成功 否则执行不了
#修改后重新执行 即可成功
[root@xyy2 opt]# ansible web -m ping
192.168.64.15 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.64.16 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
ansible工具
- /usr/bin/ansible 主程序,临时命令执行工具
- !!#ff0000 /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字 !!
- /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
- /usr/bin/ansible-pull 远程执行命令的工具
- /usr/bin/ansible-vault 文件加密工具
- /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
- /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
1.执行计划任务
ansible <host-pattern> [-m module_name] [-a args]
命令 主机或者清单中的组 -m 指定模块 -a 执行的任务
--version #显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo 切换
--become-user=USERNAME #指定sudo的runas用户,默认为root vim /etc/sudoers 用户权限
-K, --ask-become-pass #提示输入sudo时的口令
-f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数
支持通配符
ansible all -m ping
ansible "*" -m ping
-f 并行执行
[root@node1 ~]#ansible all -a "sleep 3" -f1
[root@node1 ~]#ansible all -a "sleep 3" -f4
执行返回结果 执行返回结果
- 绿色:执行成功并且不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
配置文件中定义
vim /etc/ansible/ansible.cfg
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
2.ansible-doc
ansible-doc -l 查看所有支持模块
[root@xyy2 opt]# ansible-doc -l
fortios_router_community_list Configure community lists in Fortinet's Forti...
azure_rm_devtestlab_info Get Azure DevTest Lab facts
ecs_taskdefinition
ansible-doc 模块名称 显示对应模块的详细信息
[root@xyy2 opt]# ansible-doc yum
> YUM (/usr/lib/python2.7/site-packages/ansible/modules/packaging/os/yum.py)
Installs, upgrade, downgrades, removes, and lists packages and groups with the
`yum' package manager. This module only works on Python 2. If you require Python
3 support see the [dnf] module.
* This module is maintained by The Ansible Core Team
* note: This module has a corresponding action plugin.
3.ansible-console
#此工具可交互执行命令,支持tab,ansible 2.0+新增
提示符格式
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
常用子命令:
设置并发数: forks n 例如: forks 10
切换组: cd 主机组 例如: cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help
root@all (4)[f:5]$ cd web
root@web (2)[f:5]$
root@web (2)[f:5]$ forks 1
root@web (2)[f:1]$
[root@node1 ~]#ansible-console
Welcome to the ansible console.
Type help or ? to list commands.
root@all (4)[f:5]$ ping
#直接使用模块
4.playbook
此工具用于执行编写好的 playbook 任务
范例
ansible-playbook hello.yml
cat hello.yml
---
#hello world yml file
- hosts: websrvs
remote_user: root #执行用户
gather_facts: no #不收集系统信息 提高执行效率
tasks:
- name: hello world
command: /usr/bin/wall hello world
5.ansible命令常见用法
ansible --help
Usage: ansible <host-pattern> [options]
选项:
-a MODULE_ARGS, --args=MODULE_ARGS #指定模块的参数
--ask-vault-pass #询问账号的密码
-B SECONDS, --background=SECONDS #异步运行,在指定秒后异步运行失败
-C, --check #不做出任何改变,只是进行测试检查
-D, --diff #当更改(小)文件和模板时,显示这些文件中的差异
-e EXTRA_VARS, --extra-vars=EXTRA_VARS #将其他变量设置为key=value或YAML/JSON,如果文件名前面有@
-f FORKS, --forks=FORKS #指定要使用的并行进程数,例如100台机器,-f指定每次运行几台,默认每次运行5台
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY #指定主机列表路径,如果不指定,默认为/etc/ansible/ansible.cfg中指定的hosts
-l SUBSET, --limit=SUBSET #将选定的主机限制为附加模式。
--list-hosts #列出清单中的主机列表,不进行任何操作
-m MODULE_NAME, --module-name=MODULE_NAME #指定要执行的模块名称,默认为 command 模块
-M MODULE_PATH, --module-path=MODULE_PATH #指定要执行模块的路径,默认模块路径为~/.ansible/plugins/modules:/usr/share/ansible/plugins
-o, --one-line #浓缩输出
--playbook-dir=BASEDIR #指定playbook文件目录
-P POLL_INTERVAL, --poll=POLL_INTERVAL #指定轮训间隔时间,默认为15
--syntax-check #如果使用了playbook则执行--syntax-check对剧本进行check
-t TREE, --tree=TREE #将ansible输出记录到指定目录
--vault-id=VAULT_IDS the vault identity to use
--vault-password-file=VAULT_PASSWORD_FILES
vault password file
-v, --verbose #详细模式(-VVV更多,-VVVV可启用连接调试)
--version #显示程序的版本号、配置文件位置、配置模块搜索路径、模块位置、可执行位置和退出
特权提升选项:
-b, --become #临时使用--become-method指定的提取方法
--become-method=BECOME_METHOD #使用权限提升方法(默认值=sudo)
--become-user=BECOME_USER #以该用户的身份运行操作(默认值=root)
-K, --ask-become-pass #请求权限提升密码
连接选项:
-k, --ask-pass #请求连接密码
--private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE #指定私钥文件进行登录
-u REMOTE_USER, --user=REMOTE_USER #指定连接用户,默认不指定则为hosts文件中用户
-c CONNECTION, --connection=CONNECTION #连接方式,默认为smart,还有ssh和sftp
-T TIMEOUT, --timeout=TIMEOUT #ansible连接超时时间,默认为10s
--ssh-common-args=SSH_COMMON_ARGS #指定要传递到SFTP/SCP/SSH的常见参数(例如ProxyCommand)
--sftp-extra-args=SFTP_EXTRA_ARGS #指定要传递到SFTP的额外参数(例如-f、-l)
--scp-extra-args=SCP_EXTRA_ARGS #指定要传递到SCP的额外参数(例如-1)
--ssh-extra-args=SSH_EXTRA_ARGS #指定只传递给ssh的额外参数(例如-R)
总结:
/usr/bin/ansible Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc Ansible 模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault Ansible 文件加密工具
/usr/bin/ansible-console Ansible基于Linux Consoble界面可与用户交互的命令执行工具
模块
模块参考文档
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
1.Command模块
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
默认使用的模块是 command,所以我们可以不加-m这个参数,但是command模块对通配符,管道符,重定向等都不支持所以我们一般都使用shell,修改配置文件
vim /etc/ansible/ansible.cfg
注意:此模块不具有幂等性
[root@xyy2 opt]# ansible web -a 'hostname'
192.168.64.15 | CHANGED | rc=0 >>
localhost.localdomain
192.168.64.16 | CHANGED | rc=0 >>
xyy1
[root@xyy2 opt]# ansible web -a "touch /opt/test1" #在远程主机新建文件
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command
because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in
ansible.cfg to get rid of this message.
#告警是提示建议使用file模块
192.168.64.15 | CHANGED | rc=0 >>
192.168.64.16 | CHANGED | rc=0 >>
2.shell模块
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
远程主机上调用shell解释器运行命令,支持shell的各种功能
注意:此模块不具有幂等性
[root@xyy2 opt]# ansible web -m shell -a "echo hello > /opt/test1"
192.168.64.15 | CHANGED | rc=0 >>
192.168.64.16 | CHANGED | rc=0 >>
[root@xyy2 opt]# ansible web -a "cat /opt/test1"
192.168.64.15 | CHANGED | rc=0 >>
hello
192.168.64.16 | CHANGED | rc=0 >>
hello
3.Script模块
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
[root@xyy2 opt]# vim 1.sh
#!/bin/bash
hostname
[root@xyy2 opt]# ansible web -m script -a '/opt/1.sh'
192.168.64.16 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.64.16 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.64.16 closed."
],
"stdout": "xyy1\r\n",
"stdout_lines": [
"xyy1"
]
}
4.copy模块
功能:从ansible服务器主控端复制文件到远程主机
用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
src 代表源文件路径
dest 代表文件落地路径
owner 属主
group 属组
mode 代表权限
backup 如果复制时有同名文件会先备份再复制
force 当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
实例:
[root@xyy2 ~]# ansible web -m copy -a "src=/etc/passwd dest=/opt owner=lisi mode=640"
192.168.64.16 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true, #已做处理 true
"checksum": "48bca2a356368e9b5da1bb536f9084407f834393",
"dest": "/opt/passwd", #目标路径
"gid": 0,
"group": "root",
"md5sum": "f6268754282a167de42e5d1153370",
"mode": "0640", #权限
"owner": "lisi", #属主
"secontext": "system_u:object_r:usr_t:s0",
"size": 2098,
"src": "/root/.ansible/tmp/ansible-tmp-1719295851.52-116915-42251030533280/source",
"state": "file",
"uid": 1002
}
192.168.64.15 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "48bca2a356368e9b5da1bb536f9084407f834393",
"dest": "/opt/passwd",
"gid": 0,
"group": "root",
"md5sum": "f6268754282a167de42e5d1153370",
"mode": "0640",
"owner": "lisi",
"secontext": "system_u:object_r:usr_t:s0",
"size": 2098,
"src": "/root/.ansible/tmp/ansible-tmp-1719295851.51-116913-66302586006163/source",
"state": "file",
"uid": 1002
}
5.get_url
功能: 用于将文件从http、https或ftp下载到被管理机节点上
ansible web -m get_url -a "url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt"
url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force:如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件
checksum:对目标文件在下载后计算摘要,以确保其完整性
url_username:用于HTTP基本认证的用户名。对于允许空密码的站点,此参数可以不使用`url_password'
url_password:用于HTTP基本认证的密码。如果未指定`url_username'参数,则不会使用`url_password'参数
validate_certs:如果“no”,SSL证书将不会被验证。适用于自签名证书在私有网站上使用
timeout: URL请求的超时时间,秒为单位
ansible web -m get_url -a 'url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt checksum="md5:3ca4a37931e9fa301964b8ce889da8cb"'
##### checksum 后面不要忘记 加 md5: ###
6. Fetch 模块
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
[root@xyy2 ~]# ansible web -m fetch -a "src=/etc/passwd dest=/opt/"
[root@xyy2 opt]# ls
{ 192.168.64.15 192.168.64.16 1.sh
7.file模块
功能:设置文件属性,创建软链接等 比如创建文件、创建链接文件、删除文件等
path 指定文件路径
state 文件状态 有:新建(touch) 删除(absent) 文件夹(directory) 连接文件(link)等
src 源文件
mode 权限
owner 属主
group 属组
recurse 递归
directory 如果目录不存在,就创建目录
hard:创建硬链接
实例:
[root@xyy2 opt]# ansible web -m file -a "path=/opt/passwd state=absent" #删除远程设备上的/opt下面的passwd文件
[root@xyy1 opt]# ls
passwd rh SCANIP.log
[root@xyy1 opt]# ls
rh SCANIP.log
[root@xyy2 opt]# ansible web -m file -a "path=/opt/100 state=directory" #目录不存在的时候 自动创建目录
[root@xyy2 opt]# ansible web -m file -a "src=/opt/100 path=/mnt/100-link state=link" #创建软链接
[root@xyy1 mnt]# ll
total 0
lrwxrwxrwx. 1 root root 8 Jun 25 15:12 100-link -> /opt/100
##8.stat模块 功能:检查文件或文件系统的状态 注意:Windows,需要win_stat模块 选项:path:文件/对象的完整路径(必须) 判断:
exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配
[root@xyy2 opt]# ansible web -m stat -a "path=/opt/test1" #检查文件是否存在
9.unarchive 模块
功能:解包解压缩 实现有两种用法: 1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略 2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
---------------------------------------------------------------------
ansible websrvs -m unarchive -a 'src=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no'
copy=no 代表压缩文件不是去本机上查找 在远程主机上找源
10. Hostname模块
功能:管理主机名
ansible 192.168.64.10 hostname -a 'name=node3 '
11.cron模块
minute==分
hour==时
day==日
month==月
weekday==周
job=任务
name==任务计划名称
user==指定用户添加crontab
state=值为present,则添加任务计划,值为absent则删除任务计划
实例
ansible 192.168.91.101 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
#除任务
ansible websrvs -m cron -a "name='backup mysql' state=absent"
12.yum与apt模块
功能:yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本apt 模块管理 Debian 相关版本的软件包
name 所安装的包的名称
state present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache 强制更新yum的缓存
conf_file 指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check 是否禁止GPG checking,只用于presentor latest。
disablerepo 临时禁止使用yum库。 只用于安装或更新时。
enablerepo 临时使用的yum库。只用于安装或更新时
实例
ansible websrvs -m yum -a 'name=httpd state=present' #安装
ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel' #启用epel源
进行安装
ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #升级除
kernel和foo开头以外的所有包
ansible websrvs -m yum -a 'name=httpd state=absent' #删除
13. servcie
功能:管理服务
name参数: 此参数用于指定需要操作的服务名称,比如 nginx。
state参数: 此参数用于指定服务的状态,可用值有 started、stopped、restarted、reloaded。 启动 停止 重启等
enabled参数: 此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
实例:
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/'
/etc/httpd/conf/httpd.conf"
14.User模块
功能:管理用户
comment 用户的描述信息
createhome 是否创建家目录
force 在使用state=absent时, 行为与userdel –force一致.
group 指定基本组
groups 指定附加组,如果指定为(groups=)表示删除所有组
home 指定用户家目录
move_home 如果设置为home=时, 试图将用户主目录移动到指定的目录
name 指定用户名
non_unique 该选项允许改变非唯一的用户ID值
password 指定用户密码,使用 SHA512 hash
remove 在使用state=absent时, 行为是与userdel –remove一致
shell 指定默认shell
state 设置帐号状态,不指定为创建,指定值为absent表示删除
system 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid 指定用户的uid
update_ password
always 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
on_create 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定
实例:
创建一个用户 不能登录 没有家目录 指定uid
[root@xyy2 opt]# ansible web -m user -a "name=old uid=1999 shell=/sbin/nologin createhome=no"
[root@xyy1 mnt]# id old
uid=1999(old) gid=1999(old) groups=1999(old)
#设置密码
ansible localhost -m debug -a "msg={{ 'bgx' | password_hash('sha512', 'salt') }}" # 加密 生成非明文密码
ansible web -m user -a 'name=old1 password=$6$salt$WP.Kb1hMfqJG7dtlBltkj4Um4rVhch54R5JCi6oP73MXzGhDWqqIY.JkSOnIsBSOeXpKglY7gUhHzY4ZtySm41 create_home=yes shell=/bin/bash'
15.Group模块
管理组 实例
ansible web -m group -a 'name=nginx gid=66 system=yes' #创建
#删除
ansible web -m group -a 'name=nginx state=absent'
16.Lineinfile模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块 regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
如果想进行多行匹配进行替换需要使用replace模块
功能:修改文本内容 参数:
path 指定要操作的文件
regexp 使用正则表达式匹配对应的行
line 修改为新的内容
insertafter 将文本插入到“指定的行”之后
insertbefore 将文本插入到“指定的行”之前
state 删除对应的文本时,需要state=absent
backrefs 1.支持后向引用、2.当未匹配到内容则不操作文件
backup 是否在修改文件之前对文件进行备份
create 当要操作的文件并不存在时,是否创建对应的文件
ansible web -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
17.replace模块
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"
ansible web -m replace -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen.*' replce='Listen 80'"
18.setup模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度
可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息
注:如果需要调用自带变量 不要禁用
ansible all -m setup
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup -a "filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_uptime_seconds"
ansible all -m setup -a "filter=ansible_processor*"
ansible all -m setup -a 'filter=ansible_env'
Playbook
启用前 建议修改家目录配置
vim ~/.vimrc
set ai #文本编辑器自动对齐
set ts=2 #tab键 替代空格 代表2空格
#如果操作报错 可以sudo
******************************************************************
ubuntu操作系统下则是存于/etc/vim/vimrc
三种常见的数据格式
- XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
- JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释
- YAML:YAML Ain't Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab
playbook特点:
- playbook 剧本是由一个或多个"play"组成的列表
- play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
- Playbook 文件是采用YAML语言编写的
Playbook 可用于声明配置,更强大的地方在于,在 playbook 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.
我们使用 adhoc 时,主要是使用 /usr/bin/ansible 程序执行任务 而使用 playbook 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范.
执行playbook前检查下是否有语法错误
ansible-playbook --syntax-check name.yml
1.YAML
:YAML Ain't Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言) AML 官方网站:http://www.yaml.org
ansible 官网: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
YAML语法简介
- 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( … )用来表示文件的结尾(可忽略)
- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
- 使用#号注释代码
- 缩进必须是统一的,不能空格和tab混用
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
- YAML文件内容是区别大小写的,key/value的值均需大小写敏感
- 多个key/value可同行写也可换行写,同行使用,分隔
- key后面冒号要加一个空格 比如: key: value
- value可是个字符串,也可是另一个列表
- YAML文件扩展名通常为yml或yaml
- 一个name只能包括一个task
比如:
---
- hosts:
remote_user:
tasks:
- name:
playbook 中的核心组件
hosts 指定了在那些机器上执行任务
remote_user 以谁的身份运行
tasks 任务列表 执行动作
gather_facts: no #不手机系统信息 提高执行效率
2.playbook核心组件
一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:
- Hosts 执行的远程主机列表
- Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
- Variables 内置变量或自定义变量在playbook中调用
- Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
hosts组件
Hosts: playbook 中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用 于指定要执行指定任务的主机,须事先定义在主机清单中
- hosts: web:app #定义的群组
remote_user
remoteuser: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudouser指定sudo时切换的用户
---
- hosts: websrvs
remote_user: root
tasks:
- name: test connection
ping:
remote_user: wang
sudo: yes
#默认sudo为root
sudo_user:wang
#sudo为wang
task列表和action组件
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。
ction: module arguments
#示例: action: shell wall hello
module: arguments
#示例: shell: wall hello
*************************************************************************
#第一个yml文件
---
# first yaml file
- hosts: web
remote_user: root
gather_facts: no #不收集系统信息,提高执行效率
tasks:
- name: test network connection
ping:
- name: excute command
command: wall "hello world!"
新建用户 指定uid 名称 不建家目录
---
- hosts: web
tasks:
- name: useradd
user: name=123 udi=2666 shell=/sbin/nologin system=yes createhome=no
Handlers notify
Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作 注意:
- 如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次。
- 只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers
- handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler
3.playbook命令
--syntax-check #语法检查,可缩写成--syntax, 相当于bash -n
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
--list-hosts #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的name
-v -vv -vvv #显示过程