ansible 模块实验

ansible 实验
实验环境:
3台主机        ip 地址                 角色        主机名       cpu核心
主机1    192.168.200.111      Ansible      ansible            1
主机2    192.168.200.112       Client         client1            1
主机3    192.168.200.113       Client         client2            2
===================================================
环境准备
【1】修改3个主机的主机名  ansible  client1  client2
【2】3台主机关闭防火墙和安全机制
【3】保证3台能够上网  nslookup www.baidu.com
【4】主机1
vim /etc/hosts
192.168.200.111   ansible
192.168.200.112    client1
192.168.200.113    client2
保存退出
scp /etc/hosts 192.168.200.112:/etc/
scp /etc/hosts 192.168.200.113:/etc/
【5】yum 安装ansible  (强烈推荐)
cd  /etc/yum.repos.d
wget http://mirrors.aliyun.com/repo/Centos-7.repo
ls
yum clean all
yum -y install ansible
ansible --version    //用来测试,是否来连接成功
【6】pip 方式安装ansible(比较麻烦,python需要安装很久)
安装支持包
yum -y install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel openssl
源码编译Python3.5
tar xf Python-3.5.2.tgz -C /usr/src/
cd /usr/src/Python-3.5.3/
./configure --prefix=/usr/local/python/ && make && make install
ln -s /usr/local/python/bin/python3 /usr/bin/python3
which python3
python3 -V
使用pip3安装ansible
/usr/local/python/bin/pip3 install ansible
等待ansible安装完毕后,注意基于pip安装的没有配置文件,需要自己建立。
ln -s /usr/local/python/bin/ansible/ /usr/local/bin/
which ansible
ansible --version  //查看版本
【7】创建SSH免交互登录
【ssh-keygen -t rsa  //这种方式是交互的】
免交互方式:
ssh-keygen -t rsa -P "" -f .ssh/id_rsa    //-P ""  指定密码为空   -f .ssh/id_rsa   指定文件存放位置  就不用回车了。
ls .ssh/
------------------------------------------------------------------
【8】client1 主机:
环境准备:
hostname client1
bash
ifconfig ens32
iptables -F
setenforce 0
systemctl stop firewalld
------------------------------------------------------------------
【9】client2 主机:
环境准备:
hostname client2
bash
ifconfig ens32
iptables -F
setenforce 0
systemctl stop firewalld
---------------------------------------------------------------------
【10】ansible主机发送公钥给client
主机ansible操作
ssh-copy-id [email protected]
ssh-copy-id [email protected]
【11】测试免密连接,主机ansible操作
ssh [email protected]
ssh [email protected]
=======ansible部署完成===以下为通过ansible 对设备进行管理。
【12】ansible配置
在主机ansible上进行操作
cp /etc/ansible/hosts{,.bak}
vim  /etc/ansible/hosts   //在末行添加  设置一个组与成员
[crushlinux]
192.168.200.112
192.168.200.113
保存退出
ansible -i  crushlinux -m ping
  //或者用这个 ansible -i /etc/ansible/hosts crushlinux -m ping
------环境已经结束-----
测试:
在ansible查看client两台主机的磁盘:
ansible crushlinux -a "df -Th"
--=============================
解决为1000台主机发密钥对的问题  (如果已经为客户机配过密钥了, 可以rm -rf .ssh/authorized_keys 将密钥对删除)
用yum安装sshpass
在ansible主机上 :
yum -y intall sshpass
--------------------------------------------------
[sshpass使用方法]
1、直接远程连接某主机
sshpass -p {密码} ssh {用户名}@{主机IP}
2、远程连接指定ssh的端口
sshpass -p {密码} ssh -p ${端口}{用户名}@{主机IP}
3、从密码文件读取文件内容作为密码去远程连接主机
sshpass -f ${密码文本文件} ssh {用户名}@{主机IP}
4、从远程主机上拉取文件到本地
sshpass -p {密码} ssh {用户名}@{主机IP}:${远程主机目录} ${本地主机目录}
5、将主机目录文件拷贝至远程主机目录
sshpass -p {密码} scp ${本地目录} {用户名}@{主机IP}:${远程主机目录}
-------------------------------------------------------
eg:
sshpass -p 123456 ssh-copy-id [email protected]
sshpass -p 123456 ssh-copy-id [email protected]
//通过这个,密钥对就成功发送完毕 ,这种方式就是免交互的操作
【rm -rf .ssh/known_hosts  //删除与其他主机建立的连接
注意:sshpass不能解决第一次连接问题
即 sshpass  -p 1234456 ssh [email protected]
//会发现连接不成功】
解决办法如下:
6、 远程连接主机并执行命令
sshpass -p {密码} ssh -o StrictHostKeyChecking=no {用户名}@{主机IP} 'rm -rf /tmp/test'
//// -o StrictHostKeyChecking=no :忽略密码提示
eg:sshpass  -p 1234456 ssh -o StrictHostKeyChecking=no  [email protected]
还有一种方法是:
vim /etc/ssh/ssh_config
35   StrictHostKeyChecking no   //修改为no
保存退出
//就可以不用在连接时需要yes了
还有一种方法,可以不用发密钥对
vim /etc/ansible/hosts
在最末行添加 
[nokey]
clent2 ansible_ssh_host=192.168.200.113 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
clent1 ansible_ssh_host=192.168.200.112 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
保存与退出
ansible nokey -m ping   //看是否能通,通了就返回pong
==========================================
注意:【1】ansible 如果使用默认的Inventory 文件也即{/etc/ansible/hosts}文件,也可以不用指定
ansible  crushlinux -m ping
  要是默认文件位置不是这个地方,需要用(-i 文件路径)指定文件位置 ansible -i /etc/ansible/hosts crushlinux -m ping
【2】定义组成员方式
vim /etc/ansible/hosts
[client]
client1
client2
[test01]
client[1:2]   //这些方式都可以
保存退出
ansible client -m ping
ansible test01 -m ping
==============================================
ansible 语法
1、ansible client -m ping   //client 表示组  -m表示指定模块
2、ansible client -m command  -a "free -m"//  command模块表示提供相应的shell命令   -a 给模块传递参数即执行什么命令 command 是默认的,可以省略即ansible client -m   -a "free -m"
3、ansible client -m  -a "free -m" --limit 192.168.200.112 // --limit 表示限定哪个主机执行
4、直接对IP进行执行
ansible 192.168.200.112 -a "free -m"    //一个固定的 IP
或者 ansible 192.168.200.* -a "free -m" //表示一个网段
==============================================
ansible命令
输入ansible   在按两次tab键  就会看到好多
==============================================
Ansible是生产环境中使用非常频繁的命令之一,主要在以下场景应用
非固化需求
临时一次性操作
二次开发接口调用
格式:
ansible   <host-pattern>  [options]
参数:
-v :输出详细的执行过程信息,可以得到执行过程所有信息
-i  PATH :指定inventory信息,默认为/etc/ansible/hosts
-f  NUM :并发线程数,默认为5个线程
-p  rivate-key=PRIVATE_KEY_FILE 指定秘钮文件
-m  NAME :指定执行时使用的模块
-M  DIRECTORY :指定模块存放路径,默认为/usr/share/ansible
-a   ARGUMENTS :指定模块参数
-u   USERNAME :指定远程主机USERNAME运行命令
-I subset  :限定运行主机
--list-hosts  :列出符合条件的主机列表,不执行任何命令。
主机组和主机注意事项:
all 代表所有主机
webA:webB 可以指定多台主机
all:\!webA 指定all但是不包含webA ,注意,需要加转义符号\
ansible-doc:帮助文档
ansible-doc -l
ansible-doc -s shell  //-s指定模块
ansible-doc -s raw
===============================================
案例:
A、检查所有的主机存活:
ansible all -f 5 -m ping
B、列出crushlinux组中所有主机列表
ansible crushlinux --list-host
ansible crushlinux --list
ansible返回结果:红色表示执行过程中有异常,绿色表示执行成功且没有对目标主机做修改,橘黄色表示命令执行后目标有状态变化。
===============================================
2、ansible-playbook
类似于Linux系统中的sh或 source命令,用来执行系列任务。
工作机制:通过读取编写好的playbook 文件实现集中处理任务,ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码
语法:ansible-playbook playbook.yml
playbookyml 需要之前编译好建议写playbook.yml文件的绝对路径
3、ansible-console
ansible-console 是ansible.为用户提供的一款交互式工具
在终端输入ansible-console命令后显示 默认密码ansible
三、ansible模块
1、command模块不支持管道,重定向shell的特性
chdir:在远程主机上运行命令前要提前进入的目录
eg:为所有主机创建用户,并进行查看
ansible crushlinux -m raw -a "useradd crushlinux"
ansible all -m command -a "chdir=/home ls ./"
ansible crushlinux -a 'uptime'
creates:在命令运行时创建一个文件,如果文件已经存在,则不会创建任务
removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务
executeble:指明运行命令的shell 程序
2、shell模块
Shell 模块在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令,和command模块的区别是它支持shell特性,如管道,重定向等。
eg: ansible crushlinux -m shell -a 'echo "crushlinux'>/tmp/test.txt'
ansible crushlinux -m shell -a 'cat /tmp/test.txt'
ansible crushlinux -m shell -a 'ifconfig ens32 |awk "/ether/{print $2}"'
3、raw模块
最原始的方式运行命令(不依赖python,仅通过ssh实现)
eg: ansible crushlinux -m raw -a 'yum clean all'
ansible all -m raw -a 'yum -y install nmap'
4、copy模块
dest指出复制文件的目标目录位置,使用绝对路径。如果源是目录,指目标也要是目录,如果目标文件已经存在会覆盖原有内容
src:指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录,如果源是目录则目标也要是目录
mode:指出复制时,目标文件的权限可选
owner:指出复制时,目标文件的属主可选
group:指出复制时,目标文件的属组可选
content:指出复制到目标主机上的内容,不能与src.一起使用,相当于复制content指明的数据到目标文件中
eg:ansible crushlinux -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=crushlinux group=root"
5、hostname模块
name:主机名
eg: ansible client1 -m hostname -a "name=crushlinux"
6、yum模块
name:程序包的名称,可以带上版本号,如不指定版本号默认安装为最新版本
state=present | latest | absent:指明对程序包执行的操作,pressent 表示安装程序包,latest表示安装最新版本的程序包,absent 表示卸载程序包。
disablerepo:在用yum安装时禁用某个仓库的ID
enablerepo:在用yum 安装时启用某个参考的ID
conf file:yum运行时的配置文件而不是使用默认的配置文件
diable gpg check-yeslno:是否启用完整性校验功能
eg: ansible crushlinux -m yum -a "name=dhcp state=present"
ansible crushlinux -m yum -a "name=httpd state=present"
===================================================
案例:环境:
ansible 中1、修改了/etc/hosts 2、安装了ansible 3、修改了ansible的hosts文件 4、ssh key  其他两台主机什么都没做
【1】sshpass -p 123456 ssh-copy-id [email protected]
sshpass -p 123456 ssh-copy-id [email protected]
ansible crushlinux -m ping
ansible crushlinux -m copy -a "src=/etc/hosts dest=/etc/hosts mode=644 owner=root group=root"
ansible 192.168.200.112 -m hostname -a "name=client1"
ansible 192.168.200.113 -m hostname -a "name=clien2"
ansible crushlinux -m raw -a "iptables -F && systemctl stop firewalld"
=====================================================
7、service模块
name:被管理的服务名称
state=started | stopped | restarted:动作包含启动关闭或重启
enabled=yes | no:表示是否设置该服务开机自启动
runlevel:如果设定了enabled开机自启动,则要定义在哪些运行目标下自启动
eg: ansible crushlinux -m service -a "name=httpd state=started enabled=yes"
8、user模块
name:必选参数账号名称
state=present | absent:创建账号或者删除账号,present 表示创建,absent 表示删除。
system=yes | no:是否为系统账号
uid:用户UID
group:用户的基本组
groups:用户的附加组
shell:默认使用的shell
home:用户的家目录。
move home=yes | no:如果设置的家目录已经存在,是否将已经存在的家目录进行移动。
password:用户的密码,建议使用加密后的字符串
comment:用户的注释信息
remove=yes | no:当 state=absent时,是否删除用户的家目录
eg:ansible crushlinux -m user -a 'name=user1 system=yes uid=502 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="test user"'
ansible crushlinux -m user -a 'name=user1 state=absent remove=yes'
9、script
script 模块能够实现远程服务器批量运行本地的shell脚本。
比如要为多台机器安装nginx
首先在ansible上传安装包
写一个脚本,将安装包 nginx安装脚本交给其他多台机器
在写一个脚本 执行

猜你喜欢

转载自www.cnblogs.com/elin989898/p/11987963.html