mode :ping,command,shell,copy,file
ansible是自动化运维工具,基于Python开发。
ansible常用模式
1.ad-hoc模式(点对点模式) 使用单个模块,就相当于bash中的一句话shell
2.playbook模式(剧本模式),相当于脚本
ansible 命令执行过程
- 加载自己的配置文件,默认 /etc/ansible/ansible.cfg ;
- 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY 文件;
- 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件, sleep 0 退出;
安装
yum install epel-release -y
yum install ansible –y
管理节点 被管理节点
ssh ssh
python python
ansible
ansible 程序结构如下(yum安装):
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/X.X.X/
Help文档目录:/usr/share/doc/ansible-
Man文档目录:/usr/share/man/man1/
配置文件查找顺序
- 检查环境变量 ANSIBLE_CONFIG 指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
- ~/.ansible.cfg ,检查当前目录下的ansible.cfg配置文件;
- /etc/ansible.cfg 检查etc目录的配置文件。
管理节点的主机列表清单四种格式:(vim /etc/ansible/hosts)
1、 直接指明主机地址或主机名:
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
2、 定义一个主机组[组名]把地址或主机名加进去
[mysql_test]
192.168.253.159
192.168.253.160
192.168.253.153
3、定义组内包含组
[web]
192.168.11.128
192.168.11.129
[db]
192.168.11.130
192.168.11.131
[webs:children]
web
db
4、定义主机组的变量
[web:vars]
ansible_ssh_user=root
doc命令
ansible-doc -l #获取全部模块的信息
ansible-doc -s MOD_NAME #获取指定模块的使用帮助
命令格式
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
-a MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:
“date”,“pwd”等等
-k , --ask-pass ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证 --ask-su-pass ask for su password。su切换密码
-K , --ask-sudo-pass ask for sudo password。提示密码使用sudo,sudo表示提权操作 --ask-vault-pass
ask for vault password。假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS 后台运行超时时间 -C #模拟运行环境并进行预运行,可以进行查错测试 -c CONNECTION #连接类型使用
-f FORKS #并行任务数,默认为5
-i INVENTORY #指定主机清单的路径,默认为 /etc/ansible/hosts --list-hosts 查看有哪些主机组
-m MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可
以不用 -m参数
-o 压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S 用 su 命令 -R SU_USER 指定 su 的用户,默认为 root 用户 -s #用 sudo 命令
-U SUDO_USER 指定 sudo 到哪个用户,默认为 root用户
-T TIMEOUT 指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u REMOTE_USER 远程用户,默认为 root 用户
-v 查看详细信息,同时支持 -vvv , -vvvv 可查看更详细信息
ansible的使用首先是ssh的免密登陆
yum -y install openssh*
常用模块
ping
-bash-4.2# ansible web -m ping
172.17.0.3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.17.0.4 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.17.0.5 | SUCCESS => {
"changed": false,
"ping": "pong"
}
web在/etc/ansible/hosts中注册
command(这个模块可以直接在远程主机上执行命令,并将结果返回本主机)
不支持管道符
-bash-4.2# ansible web -m command -a 'ss -natl'
172.17.0.4 | SUCCESS | rc=0 >>
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 128 :::22 :::*
172.17.0.3 | SUCCESS | rc=0 >>
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 128 :::22 :::*
172.17.0.5 | SUCCESS | rc=0 >>
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 128 :::22 :::*
-bash-4.2# ansible web -m command -a 'chdir=/ ls' chdir相当于cd
-bash-4.2# ansible web -m command -a 'creates=/root/aa.txt ls'
一个文件名,当这个文件存在,则该命令不执行,可以用来做判断,存在aa.txt因此不会执行ls
-bash-4.2# ansible web -m command -a 'removes=/root/aa.txt ls'
一个文件名,这个文件不存在,则该命令不执行,同理
shell
-bash-4.2# ansible web -m shell -a 'ss -natl | grep 22'
172.17.0.3 | SUCCESS | rc=0 >>
LISTEN 0 128 *:22 *:*
LISTEN 0 128 :::22 :::*
172.17.0.5 | SUCCESS | rc=0 >>
LISTEN 0 128 *:22 *:*
LISTEN 0 128 :::22 :::*
172.17.0.4 | SUCCESS | rc=0 >>
LISTEN 0 128 *:22 *:*
LISTEN 0 128 :::22 :::*
在被管理机上执行shell命令
copy
src:被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制
content:用于替换"src",可以直接指定文件的值
dest:必选项,将源文件复制到的远程主机的绝对路径
backup:当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode:递归设定目录的权限,默认为系统默认权限
force:当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
others:所有的 file 模块中的选项可以在这里使用
cp a.txt /root/
-bash-4.2# ansible web -m copy -a 'src=a.txt dest=/root/'
-bash-4.2# ansible web -m shell -a 'ls /root'
172.17.0.4 | SUCCESS | rc=0 >>
a.txt
anaconda-ks.cfg
172.17.0.3 | SUCCESS | rc=0 >>
a.txt
anaconda-ks.cfg
172.17.0.5 | SUCCESS | rc=0 >>
a.txt
anaconda-ks.cfg
给定内容生成文件,并制定权限
ansible web -m copy -a 'content="I am rou" dest=/data/name
mode=666'
ansible web -m shell -a 'cat /root/b.txt'
172.17.0.4 | SUCCESS | rc=0 >>
I am rou
修改内容,同名文件备份(按时间)
ansible web -m copy -a 'content="I am rourou" backup=yes dest=/root/b.txt mode=666'
172.17.0.4 | SUCCESS | rc=0 >>
total 16
-rw-r--r-- 1 root root 2 Oct 11 12:45 a.txt
-rw-r--r-- 1 root root 3862 Jul 8 2014 anaconda-ks.cfg
-rw-rw-rw- 1 root root 11 Oct 11 12:59 b.txt
-rw-rw-rw- 1 root root 8 Oct 11 12:54 b.txt.658.2019-10-11@12:59:47~
file
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner:定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效,后面跟上
src: 被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:状态,有以下选项:
directory:如果目录不存在,就创建目录
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
mkdir app
ansible web -m file -a 'path=/data/app state=directory'
-bash-4.2# ansible web -m shell -a 'ls -l /root'
172.17.0.5 | SUCCESS | rc=0 >>
total 16
-rw-r--r-- 1 root root 2 Oct 11 12:45 a.txt
-rw-r--r-- 1 root root 3862 Jul 8 2014 anaconda-ks.cfg
drwxr-xr-x 2 root root 6 Oct 11 13:08 app
-rw-rw-rw- 1 root root 11 Oct 11 12:59 b.txt
-rw-rw-rw- 1 root root 8 Oct 11 12:54 b.txt.637.2019-10-11@12:59:47~
touch app1
ansible web -m file -a 'path=/root/app1 state=file
ln -s aaa.jpg /root/bbb.jpg
ansible web -m file -a 'path=/root/bbb.jpg src=aaa.jpg state=link'
ln /root/aaa.txt /root/bbb.txt
ansible web -m file -a 'path=/root/bbb.jpg src=/root/aaa.jpg state=hard'
rm -rf a
ansible web -m file -a 'path=/root/a state=absent'
网友评论