自动化运维 ansible
ansible
首先安装虚拟机的时候没有ip
查看ip ip addr ifconfig
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改最后一行 reboot =yes
systemctl restart network
获取阿里镜像元
https://opsx.alibaba.com/mirror
找到epel 帮助
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
要是没有wget 命令 就先下载一个 yum install wget
yum install -y ansible
salt 控制节点需要安装slat-master
salt被控制节点需要安装salt-minion
ansible 通过ssh来连接并控制被控节点和进行操作
ssh的认证方式
- 密码连接
- 秘钥连接
ssh秘钥登录
ssh-keygen # 用来生成ssh的秘钥对
ssh-copy-id + ip 地址 # 复制秘钥到远程主机
ansible命令格式
ansible <host-pattern> [options]
-a MODOULE_ATGS, --args=MODULE_ARGS # 模块的参数
-C, --check # 检查,审阅
-f FORKS, --forks=FORKS # 用来做高并发的
--list-hosts # 列出主机列表
-m MOUDLE_NAME #模块名称
--syntax-check # 语法检查
-k 输入密码
查看ansible生成的文件
rpm -ql ansible | head
/etc/ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
/etc/ansible/roles
/usr/bin/ansible
/usr/bin/ansible-2
/usr/bin/ansible-2.7
/usr/bin/ansible-config
/usr/bin/ansible-connection
/usr/bin/ansible-console
ansible hosts文件解读
# This is the default ansible 'hosts' file
#
# It should live in /etc/ansible/hosts
#
# -Comments begin with the '#' character # 用来表示注释
# -Blank lines are igore # 空白行被忽略
# -Groups of hosts are delimited by [header] elements
主机组 需要在[] 下面 | 主机组由[header]元素分隔
# - You can enter hostnames or ip multiple groups
一台主机可以在多个组里面
www[001:006].example.com # 表示www001到www006的机器
host-pattern的格式
- 单个的主机
- 全部主机
- 多个主机
- 单个组
- 多个组
- 交集 'web: $db'
- 并集
- web,db
- 'web:db'
- 差集或称补集 'web: ! db'
ansible-doc 查看模块帮助信息
Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
plugin documentation tool
Options:
-a, --all **For internal testing only** Show documentation for
all plugins.
-h, --help show this help message and exit
-j, --json **For internal testing only** Dump json metadata for
all plugins.
-l, --list List available plugins
-F, --list_files Show plugin names and their source files without
summaries (implies --list)
-M MODULE_PATH, --module-path=MODULE_PATH
prepend colon-separated path(s) to module library
(default=[u'/root/.ansible/plugins/modules',
u'/usr/share/ansible/plugins/modules'])
-s, --snippet Show playbook snippet for specified plugin(s)
-t TYPE, --type=TYPE Choose which plugin type (defaults to "module")
-v, --verbose verbose mode (-vvv for more, -vvvv to enable
connection debugging)
--version show program's version number and exit
缩略版本
ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
-j # 以json的方式返回ansible的所有模块
-l, --list # 列出所有的ansible的模块
-s # 以片段式显示ansible的帮助信息
tips 系统自带的ping走的是ICMP协议
命令相关模块
command
ansible web -a 'ls /' # 第一个命令
ansible web -a 'pwd' # 查看当前所在目录
ansible web -a 'chdir=/tmp pwd' 切换目录执行命令,使用场景:是编译安装时使用
ansible web -a 'creates=/tmp pwd' # 用来判断/tmp目录是否存在,存在就不执行
ansible web -a 'creates=/data pwd' # 因为data不存在,所以才会执行
ansible web -a 'removes=/tmp pwd' #用来判断tmp是否存在,存在就执行此操作
ansible web -a 'removes=/data pwd' # 因为data不存在,所以才不会执行
查看用户是否创建成功
[root@localhost ansible]# useradd alex
[root@localhost ansible]# tail -1 /etc/passwd
alex:x:1000:1000::/home/alex:/bin/bash
[root@localhost ansible]# tail -1 /etc/shadow
alex:!!:17946:0:99999:7:::
[root@localhost ansible]# id alex
uid=1000(alex) gid=1000(alex) groups=1000(alex)
[root@localhost ansible]# echo 'alex' | passwd --stdin alex
Changing password for user alex.
passwd: all authentication tokens updated successfully.
[root@localhost ansible]#
tail -1 /etc/passwd
tail -1 /etc/shadow 意为影子
id alex
echo 'password' | passwd --stdin 'username' # 设置密码
shell
ansible web -m shell -a 'echo "password" | passwd --stdin alex' # 批量创建密码
执行远程文件
ansible ip -m shell -a 'bash a.sh' # 执行远程文件方式一
ansible ip -m shell -a '/root/a.sh'# 执行远程方式二,文件必须有执行权限 x
ansible ip -m shell -a '/root/a.py' 执行远程的python脚本
script
ansible web -m script -a '/root/m.sh' # 执行本地的文件,执行管控机上的文件
ansible web -m script -a 'removes=/root/m.sh /root/m.sh'
# 用来判断被管控机上是不是存在文件,如果存在,存在即执行,不存在即跳过
ansible web -m script -a 'creates=/root/a.sh /root/m.sh'
# 用来判断被管控机上是不是存在,存在即跳过
文件相关操作
copy
backup 备份,以时间戳结尾
dest 目的地址 destination 目的地
group 文件的属组
mode 文件的权限 r 4 w 2 x 1
owner 文件的属主
src 源文件
# 通过md4码来判断是否需要复制
ansible db -m copy -a 'src=/root/a.txt dest=/tmp/a.txt'
# 复制本地文件到远程主机
amsible db -m copy -a 'src=root/a.txt dest=/tmp/a.txt mode=755' 修改文件的权限
ansible web -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755 owner=alex' 修改文件的属组
ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=alex' 复制本地目录到远程主机,如果改变文件的属性,则文件夹内的文件也会改变
复制整个文件夹 包括文件
ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/1/ mode=755 owner=alex' 复制本地目录中国的所有文件 到目的地址
ansible web -m copy -a 'content="杰森斯坦森\n" dest=/tmp/a.txt ' 直接将文本内容注入 覆盖到远程主机
file
tips
inode 硬盘的地址
id 获取到的是内存地址
ln -s a.py b.py 创建软连接
ln a.py c.py 创建硬链接
当 源文件发生变化时,软连接和硬链接都会随着发生变化
ansible db -m file -a 'path=/smlz state=directory'
# 在远程机器上创建文件夹
ansible db -m file -a 'path=/root/q.txt state=touch'
# 在远程机器中创建文件
ansible db -m file -a 'path=/tmp/f src=/etc/fst state=link' 创建软连接src是源地址,path是目标地址
ansible db -m file -a 'path=/tmp/f state=absent'
# 用来删除文件或者文件夹
fetch
dest 目的地址
src 源地址
ansible web -m fetch -a 'src=/var/log/cron dest =/tmp'
# 下载被控节点的文件,每台机器创建一个文件夹,并保留原来的目录结构