//系统、版本
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 10 (buster)
Release: 10
Codename: buster
$ uname -r
4.19.97-v7l+
$ ansible --version
ansible 2.7.7
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/pi/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.7.3 (default, Dec 20 2019, 18:57:59) [GCC 8.3.0]
//前提
//ansible使用基于ssh,所以服务器间互免密登陆非常重要,可参考我的另一篇博文
//[Linux下ssh单向免密登陆/互免密登陆](https://blog.csdn.net/qq_35590198/article/details/87360081)
//另,需要安装python (一般使用自带的默认版本即可)
//安装ansible
ansible: /usr/bin/ansible /etc/ansible /usr/share/ansible /usr/share/man/man1/ansible.1.gz
//配置文件
180 deprecation_warnings = False
[localhost-vm]
192.168.56.20 ansible_ssh_user=root ansible_ssh_port=22
//ansible_ssh_user 为指定使用的用户,ansible_ssh_port 为指定ssh端口,这2个参数如果都为默认,否则都可以省略
//配置完毕(要注意的是ansible的配置文件修改后不需要重新载入之类的操作,保存后即可使用)
//命令示例 通过shell模块安装包
//-i 指定使用的hosts
//localhost-vm 要执行的命令的主机组或ip地址(根据实际会不同)
//-m 指定使用什么模块(根据使用的模块不同,命令各不相同)
//-a 指定执行什么命令(即命令的内容)
//-vvvv 显示执行命令的详细程度,v越多越详细,反之该选项可以忽略
//命令示例 判断 localhost-vm 主机组下的主机是否存活
//命令示例 批量创建用户(用户名以及密码明文)
/etc/ansible
---
- hosts: localhost-vm
tasks:
- name: create user
user:
name: "{
{ item.user }}"
password: "{
{ 'item.pass' | password_hash('sha512') }}"
state: present
loop:
- {
user: user-name1, pass: user-passwd}
- {
user: user-name2, pass: user-passwd}
localhost-vm //hosts中的群组名称或ip
loop //所需创建的用户名以及密码
//命令示例 从ansible推送文件到群组
localhost-vm //群组名或ip
copy //copy是模块名
src //后接源目标路径
dest //后接目的目标(根据示例这里可以为目录,可以为不同名称文件(若为文件则传输并改名))(可省略)
mode //指定文件权限(可省略)
owner //指定文件所有者(可省略)
//通过
//命令示例,下载文件(目标文件必须是具体文件)
//fetch 文件下载模块
//src 下载源文件路径
//dest 下载目的目录
//命令示例 删除文件
//检查
//命令示例 使用file模块
name //后接目标的绝对路径
state //决定创建的是目录还是文件
touch //表示创建
absent //反之 absent 表示删除(包含文件和目录)
directory //表示目录
//创建软链接
link //表示软链接
src //源
dest //目标
//删除软链接
//命令示例 hostname模块修改主机名
name //后接主机名
//命令示例 cron模块
cron //模块名
minute //定时什么时候执行(注意,crontab中 分 时 日 月 周 5个时间如没有指定则为 * )
job //"具体的任务内容"
name //作业名称
//禁用crontab任务
//启用crontab任务
//删除crontab任务
//检查
//命令示例 yum模块
yum //模块名
name //后接需要安装的包名,多个时用 , 隔开。也可接本地rpm路径,安装本地包(如name=/root/src/popt-static-1.13-7.el6.x86_64.rpm)
state //state有多种状态('present' or 'installed', 'latest' 或 'absent' or 'removed')
update_cache //更新缓存(可忽略)
//卸载包
//命令示例 service模块
service //模块名称
name //后接服务名称
state //后接操作(包含 {
started | stopped | restarted | reloaded})
enable //是否开机启用(可忽略)(yes or no 或 true or false)
//命令示例 user模块
user //模块名
name //指定用户名
shell //指定使用的shell
system //是否是系统用户(可忽略)
groups //指定附属组
group //指定主组
home //指定家目录(可忽略)
comment //注释(可忽略)
//需要注意:主组、附属组、家目录等如果不存在需要先创建
//更多参数,详见
//删除用户
//检查
//命令示例 group模块
group //模块名
name //指定组名称
system //是否是系统组(可忽略)
//更多参数,详见
//删除组
//检查
//命令示例 ansible-galaxy [官网地址](https://galaxy.ansible.com)
//galaxy表示一种可扩充语言,通过ansible-galaxy命令,可以从网络上把已经各种写好的galaxy下载下来使用。
//ansible编译安装jdk
$ pwd
../roles/jdk-ansible-role
$ tree -N ./
./
├── files
│ └── jdk-8u241-linux-x64.tar.gz
└── jdk.yaml
1 directory, 2 files
//playbook内容
$ cat jdk.yaml
====分割线====
- hosts: localhost-vm
remote_user: root
roles:
- ..ansible/roles/jdk-ansible-role
tasks:
- name: create dir
file: name=/usr/java state=directory
- name: copy and unzip
unarchive: src=jdk-8u241-linux-x64.tar.gz dest=/usr/java/
- name: set env
lineinfile: path=/etc/profile insertafter={
{
item.position }} line={
{
item.value }} state=present
with_items:
- {
position: EOF, value: "JAVA_HOME=/usr/java/jdk1.8.0_241"}
- {
position: EOF, value: "PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin"}
- {
position: EOF, value: "CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME%/lib/dt.jar:$JAVA_HOME/lib:$JAVA_HOME/jre/lib"}
- {
position: EOF, value: "export JAVA_HOME PATH CLASSPATH"}
- name:
file: dest=/usr/java/jdk1.8.0_241 mode=0755 recurse=yes
- name: source profile
shell: source /etc/profile
====分割线====
//执行playbook
$ sudo ansible-playbook jdk.yaml
//
//验证
$ sudo ansible localhost-vm -m shell -a 'source /etc/profile && java -version