(1). 机器准备

机器名称 ip 角色
manager 10.211.55.100 控制节点
test 10.211.55.101 被控节点

(2). 配置hosts

[lixin@manager ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.211.55.100   manager manager
10.211.55.101   test    test

(3). 配置密钥

# 创建密钥对
[lixin@manager ~]$ ssh-keygen
# 拷贝公钥到远程机器上
[lixin@manager ~]$ for node in test
> do
> ssh-copy-id $node
> done

# 配置本机连接远程SSH时不提示是否要保存密钥
[lixin@manager ~]$ ssh-keyscan test >> ~/.ssh/known_hosts

# 测试是否能连接到被控机器
[lixin@manager ~]$ ssh test
Last login: Thu Jun 17 14:38:00 2021 from manager
[lixin@test ~]$

(4). 安装Ansible

# 只需要在控制节点,安装Ansible,被控节点只需要开启ssh即可.  

# 切换到root账户下
[lixin@manager ~]$ su - root
# 安装ansible
[root@manager ~]# yum install -y  epel-release
[root@manager ~]# yum install -y  ansible
# 添加普通用户到root组
[root@manager ~]# gpasswd -a lixin root

(5). Ansible相关文件

(6). ansible.cfg

[defaults]

# 主机清单文件
#inventory      = /etc/ansible/hosts
#library        = /usr/share/my_modules/
#module_utils   = /usr/share/my_module_utils/
# 临时存放py脚本目录
#remote_tmp     = ~/.ansible/tmp
#local_tmp      = ~/.ansible/tmp
# 插件文件
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
# 并发管理ansible机器
#forks          = 5
#poll_interval  = 15
# 通过sudo变成root
#sudo_user      = root
#ask_sudo_pass = True
#ask_pass      = True

# 检查对应目标服务器的host_key(建议打开,免去每次连接被控机器,都要通过键盘敲:yes)
host_key_checking = False
# 指定角色目录
#roles_path    = /etc/ansible/roles

# 日志存放路径(建议打开)
log_path = /var/log/ansible.log

(7). /etc/ansible/hosts

主要是对被控机器进行分组管理

# 1. web服务器
[webservers]
alpha.example.org
beta.example.org
192.168.1.100:222
192.168.1.110

# 2. 数据库服务器
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57

(8). Ansible常用命令

# 列出所有ansible的所有模块
[lixin@manager ~]$ ansible-doc --list

# 查看模块:ping文档
# -s  : 只看文档的简要信息,无须看所有内容
[lixin@manager ~]$ ansible-doc -s ping

(9). 测试

[lixin@manager ~]$ pwd
/home/lixin

# 1. 创建目录(项目)
[lixin@manager ~]$ mkdir -p erp

# 2. 创建主机清单文件
# [erp]  : 标签名称(对主机进行分类)
# test   : 机器名称(/etc/hosts)
[lixin@manager ~]$ cat <<EOF > erp/hosts
> [erp]
> test
> EOF

# 3. 测试ping 
#  格式: ansible  <host-pattern> [-m module_name] [-a args]
#  all : 所有的主机(你可以指定主机)
# -i : 指定主机清单
# -m : 模块名称 
# -u : 指定用户名
# -k : ansible默认是通过SSH KEY登录,也可以,通过密码登录(但是,不太建议这样做)  
# -vvv  : 查看详细的日志内容
# 
# [lixin@manager ~]$ ansible erp -i ./erp/hosts -m ping -vvv
# [lixin@manager ~]$ ansible all -i erp/hosts  -u root -k -m ping -vvv
[lixin@manager ~]$ ansible all -i ./erp/hosts -m ping -vvv
test | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

(10). Ansible执行顺序

(11). sudo特权提升

在某些情况下,root账号是禁止远程登录的,可是,普通账号权限又有限,所以,可以通过提权的方式来操作(注意:普通账号要开通sudo).

# -k,--ask-pass : 询问连接密码
# -K,--ask-become-pass : 询问特权升级密码
# 如果主机有配置key的方式,那么可以只用-K(询问特权升级密码)

# [lixin@manager ~]$ ansible test -i erp/hosts -m shell -a "yum -y install nginx" --become  --become-method=sudo --become-user=root -kK
# [lixin@manager ~]$ ansible test -i erp/hosts -m shell -a "yum -y install nginx" --become  --become-method=sudo --become-user=root -K
SSH password:      # 远程主机的密码
BECOME password[defaults to SSH password]:   # sudo - root的密码