ansible可以实现:
为什么选择ansible
选择一款配置管理软件,无外乎从以下几点来权衡利弊
ansible优点
ansible特性
对管理主机
ansible 使用以下模块,都需要安装
对于被托管主机
启动6台虚拟机
2cpu,1.5G 以上内存,10G 以上硬盘,1块网卡
主机名 | Ip地址 | 角色 |
ansible | 192.168.1.40 | 管理主机 |
web1 | 192.168.1.41 | 托管主机 |
web2 | 192.168.1.42 | 托管主机 |
db1 | 192.168.1.43 | 托管主机 |
db2 | 192.168.1.44 | 托管主机 |
cache | 192.168.1.45 | 托管主机 |
安装ansible之后可以做一些简单的任务
ansible配置文件查找顺序
ansible.cfg 配置文件
格式
ansible.cfg 配置文件
(1)修改配置文件
[root@ansible ~]# vim /etc/ansible/ansible.cfg
... ...
inventory = /etc/ansible/hosts
... ...
host_key_checking = False
... ...
[root@ansible ~]# vim /etc/ansible/hosts
... ...
[web]
web1
web2
[db]
db[1:2]
[other]
cache
(2)配置本机的域名解析
[root@ansible ~]# vim /etc/hosts
... ...
192.168.1.40 ansible
192.168.1.41 web1
192.168.1.42 web2
192.168.1.43 db1
192.168.1.44 db2
192.168.1.45 cache
ansible 主机集合 -m 模块名称 -a 模块参数
or --args 模块参数
其他参数
列出要执行的主机
批量检测主机
(3)列出要执行的主机
[root@ansible ~]# ansible web --list-hosts
hosts (2):
web1
web2
[root@ansible ~]# ansible web,cache --list-hosts
hosts (3):
web1
web2
cache
[root@ansible ~]# ansible all --list-hosts
hosts (5):
web1
web2
cache
db1
db2
(4)交互式ssh所有主机,需要输入密码
[root@ansible ~]# ansible all -m ping -k
(5)配置公钥,可以远程无密码登录
[root@ansible ~]# cd /root/.ssh
[root@ansible ~]# ssh-keygen -t rsa -b 2048 -N '' -f key
[root@ansible ~]# ssh-copy-id -i key.pub web1/web2/db1/db2/cache
[root@ansible ~]# ansible all -m ping
(6)统计所有主机的负载
[root@ansible ~]# ansible all -m command -a 'uptime'
inventory 扩展参数
inventory 参数说明
vars 变量定义,用于组名后面
例如:
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/key"
children 子组定义,用于引用其他组名称
例如:
[app:children]
web
db
分组定义、范围定义样例
子组定义
[app:children]
web
db
变量引用
[other]
cache ansible_ssh_port=222
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/key"
(1)修改web1的默认ssh端口22为222
[root@web1 ~]# vim /etc/ssh/sshd_config
... ...
Port 222
... ...
[root@web1 ~]# systemctl restart sshd
(2)修改ansible执行的主机的端口
[root@ansible ~]# vim /etc/ansible/hosts
... ...
[web]
web1 ansible_ssh_port=222
web2
... ...
(3)测试
[root@ansible ~]# ansible all -m ping
(5)统一修改ansible主机ssh远程时的秘钥文件
[root@ansible ~]# mv /root/.ssh/id_rsa /root/.ssh/id_rsa.ansible
... ...
[all:vars] //定义所有主机都执行这个文件
ansible_ssh_private_key_file="/root/.ssh/id_rsa.ansible"
... ...
(6)测试
[root@ansible ~]# ansible all -m ping
子组定义
[app:children]
web
db
(8)测试
[root@ansible ~]# ansible app --list-hosts
hosts (4):
web1
web2
db1
db2
[root@ansible ~]# mkdir myansible
[root@ansible ~]# cd myansible/
[root@ansible myansible]# vim ansible.cfg
[defaults]
inventory = myhost
host_key_checking = False
[root@ansible myansible]# vim myhost
[app1]
web1
db1
[app2]
web2
db2
[other]
cache
在当前文件夹下检测执行的主机,会报错,因为会先在当前文件夹下寻找ansible.cfg配置文件,如果找到,就执行该配置文件
[root@ansible myansible]# ansible web --list-hosts
[WARNING]: Could not match supplied host pattern, ignoring: web
[WARNING]: No hosts matched, nothing to do
hosts (0):
检测app1,会列出myhost配置文件中的主机
[root@ansible myansible]# ansible app1 --list-hosts
hosts (2):
web1
db1
无限可能
Json
(1) ansible-doc和ping模块
ansible-doc
模块的手册相当与shell的man,很重要
ansible-doc -l
列出所有模块
ansible-doc modulename 查看帮助
ping 模块
测试网络连通性, ping模块没有参数
注:测试ssh的连通性
ansible host-pattern -m ping
(2) command模块
command模块
默认模块,远程执行命令
用法
ansible host-pattern -m command -a '[args]'
查看所有机器负载
ansible all -m command -a 'uptime'
查看日期和时间
ansible all -m command -a 'date +%F_%T'
command模块注意事项
ansible all -m command -a 'ps aux|grep ssh'
ansible all -m command -a 'set'
(3) shell模块
shell
ansible all -m shell -a 'uptime'
执行以下命令查看结果,并说明原因
ansible web -m shell -a "echo ${HOSTNAME}"
ansible web -m shell -a 'echo ${HOSTNAME}'
testfile 文件在哪里
ansible cache -m shell -a 'cd /tmp'
ansible cache -m shell -a 'touch testfile'
问题解答
变量解析
文件在哪里
ansible cache -m shell -a 'chdir=/tmp touch testfile'
ansible cache -m shell -a 'cd /tmp;touch testfile'
给web1,db2主机添加用户nb并设置登录密码为123
[root@ansible ~]# ansible web1,db2 -m shell -a 'useradd nb;echo 123 |passwd --stdin nb'
(4) script模块
ansible t1 -m script -a 'urscript'
添加用户
创建执行脚本
[root@ansible ~]# vim ss.sh
#!/bin/bash
id nb
if [ ! $? -eq 0 ];then
useradd wk
echo 456 | passwd --stdin wk
fi
ansible远程批量执行脚本
[root@ansible ~]# ansible web -m script -a '/root/ss.sh'
(5) yum模块
给db组主机安装mariadb并设置开机自启
[root@ansible ~]# ansible db -m yum -a 'name="mariadb-server" state="installed"'
[root@ansible ~]# ansible db -m shell -a 'systemctl restart mariadb;systemctl enable mariadb'
cache上移除lrzsz
[root@ansible ~]# ansible cache -m yum -a 'state="removed" name="lrzsz"'
(6) service模块
停止db组下的主机的mariadb服务并取消开机自启
[root@ansible ~]# ansible db -m service -a 'name="mariadb" enabled="no" state="stopped"'
关闭other组下的主机的sshd服务
[root@ansible ~]# ansible other -m service -a 'name=sshd enabled=no state=stopped'
(7) copy模块
将本机的/etc/resolv.conf覆盖到所有主机的相同目录下
[root@ansible ~]# ansible all -m copy -a 'src="/etc/resolv.conf" dest="/etc/resolv.conf"'
同步yum文件
[root@ansible ~]# ansible all -m copy -a 'src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/'
给所有db组下的主机开启binlog日志
在本机编写修改后的my.cnf
[root@ansible ~]# vim my.cnf
[mysqld]
log_bin=mysql-bin
binlog-format=mixed
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
批量覆盖到所有db组下的主机
[root@ansible ~]# ansible db -m copy -a 'src=/root/my.cnf dest=/etc/my.cnf'
(8) lineinfile模块
批量修改db组下的主机的binlog日志的模式为row
[root@ansible ~]# ansible db -m lineinfile -a '
> path="/etc/my.cnf"
> regexp="^binlog-format"
> line="binlog-format = row"'
(9) replace模块
批量修改db组下的主机的binlog日志的模式为mixed
[root@ansible ~]# ansible db -m replace -a '
> path="/etc/my.cnf"
> regexp="= row$"
> replace="= mixed" '
(10) setup模块
获取cache主机的所有信息
[root@ansible ~]# ansible cache -m setup
过滤这些信息中的dns信息
[root@ansible ~]# ansible cache -m setup -a 'filter=ansible_dns'