ansible的Host-pattern
匹配主机的列表
All :表示所有Inventory中的所有主机
ansible all –m ping
:通配符
ansible “” -m ping 这个”*”号相当于all全部主机
ansible 192.168.1.* -m ping
ansible “*srvs” -m ping
或关系
ansible “websrvs:appsrvs” -m ping 表示这两个都执行可以加多个
ansible “192.168.1.10:192.168.1.20” -m ping
逻辑与
ansible ‘websrvs:&dbsrvs’ –m ping 就是取交集
在websrvs组并且在dbsrvs组中的主机
逻辑非
ansible ‘websrvs:!dbsrvs’ –m ping
在websrvs组,但不在dbsrvs组中的主机
综合逻辑
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正则表达式
ansible “websrvs:&dbsrvs” –m ping
ansible “~(web|db).*.magedu.com” –m ping
![](http://i2.51cto.com/images/blog/201809/26/bd57177e77cf9769c23bdfae1c90ec52.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) ![](http://i2.51cto.com/images/blog/201809/26/8c3d747259a4cdbe140e838d6f1f31a2.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 这里的波浪符表示是一个正则表达式,点在正则表示任意字符,所有要用反向单引号转义
ansible命令执行过程
ansible命令执行过程可以用-vvv来查看执行过程
可以用-vvv来查看命令执行的详细过程[[email protected] ~]# ansible ‘~(web|db|ag)ser’ -m command -a “ls /root” -vvv
1 加载自己的配置文件 默认/etc/ansible/ansible.cfg 2 加载自己对应的模块文件,如command 3 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 4 给文件+x执行 5 执行并返回结果 6 删除临时py文件,sleep 0退出
执行状态:
颜色的定义在ansible的配置文件里定义的
绿色:执行成功并且不需要做改变的操作
×××:执行成功并且对目标主机做变更
红色:执行失败
ansible使用示例
以wang用户执行ping存活检测
ansible all -m ping -u wang -k
以wang sudo至root执行ping存活检测
ansible all -m ping -u wang –b -k
以wang sudo至mage用户执行ping存活检测
ansible all -m ping -u wang –b -k –become-user mage
以wang sudo至root用户执行ls
ansible all -m command -u wang –become-user=root -a’ls /root’ -b –k -K
ansible常用模块
ping :探测对方主机是否在开机,这里的ping模块并不是用ICMP协议的
“bash
将主机设置为禁止ping
[[email protected] ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[[email protected] ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
现在在测这个主机
[[email protected] .ssh]# ansible 192.168.27.101 -m ping
192.168.27.101 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
[[email protected] .ssh]# ping 192.168.27.101
PING 192.168.27.101 (192.168.27.101) 56(84) bytes of data.
^C
— 192.168.27.101 ping statistics —
6 packets transmitted, 0 received, 100% packet loss, time 5002ms
如果把ssh服务停了也是可以执行成功的,只有把网络服务停了才会失败
Command:在远程主机执行命令,默认模块,可忽略-m选项
-a是后面要执行的参数
- 参数
- chdir 运行command命令前先cd到这个目录
- creates 如果这个参数对应的文件存在,就不运行command
- executable 将shell切换为command执行,这里的所有命令需要使用绝对路径
- removes 如果这个参数对应的文件不存在,就不运行command
bash
ansible srvs -m command -a ‘service vsftpd start‘
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang‘ 不成功
此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
用chdir进入到某个目录来执行参数
[[email protected] ~]# ansible ‘dbser‘ -m command -a ‘chdir=/app/ ls‘
192.168.27.102 | SUCCESS | rc=0 >>
123
192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd
[[email protected] ~]# ansible ‘dbser‘ -m command -a ‘chdir=/app/ creates=123 ls‘
192.168.27.102 | SUCCESS | rc=0 >>
skipped, since 123 exists 这里写着123这个文件存在就跳过,而另一个主机没有对应的文件所有执行ls
192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd
如果文件不存在则不执行
Shell:和command相似,用shell执行命令
常用参数
chdir 跟command一样的,运行shell之前cd到某个目录
creates 跟command一样的,如果某个文件存在则不运行shell
remove 跟command一样的,如果某个文件不存在则不运行shell
ansible srv -m shell -a ‘echo magedu |passwd –stdin wang‘
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F‘|‘‘{print $1,$2}‘ &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
查看主机名
[[email protected] ~]# ansible ‘dbser‘ -m shell -a ‘echo $HOSTNAME‘
192.168.27.102 | SUCCESS | rc=0 >>
102
192.168.27.128 | SUCCESS | rc=0 >>
centos6.magedu.com
体验shell和command的区别,先cd到某个需要编译的目录,执行condifgure然后,编译,然后安装。
ansible -i hosts all -m shell -a "./configure && make && make insatll" chdir=/xxx/yyy/
shell也支持条件判断&&||
[[email protected] ~]# ansible ‘dbser‘ -m shell -a ‘grep -q root /etc/passwd && ls /app‘
192.168.27.102 | SUCCESS | rc=0 >>
123
192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd
[[email protected] ~]# ansible ‘dbser‘ -m shell -a ‘grep -q rootsd /etc/passwd && ls /app‘
192.168.27.102 | FAILED | rc=1 >>
non-zero return code 如果没有则会出现非0错误码
192.168.27.128 | FAILED | rc=1 >>
non-zero return code
Script:运行脚本
- 相当于先把脚本传到远方节点,然后在执行
Copy:从服务器复制文件到客户端
- 常用参数
- src
- 用于定位ansible执行的机器上的文件,需要绝对路径。如果拷贝的是文件夹,那么文件夹会整体拷贝,如果结尾是”/”,那么只有文件夹内的东西被考过去。一切的感觉很像rsync,源地址
- content
- 用来替代src,用于将指定文件的内容,拷贝到远程文件内
- dest
- 用于定位远程节点上的文件,需要绝对路径。如果src指向的是文件夹,这个参数也必须是指向文件夹,目标文件
- backup
- 备份远程节点上的原始文件,在拷贝之前。如果发生什么意外,原始文件还能使用。
- directory_mode
- 这个参数只能用于拷贝文件夹时候,这个设定后,文件夹内新建的文件会被拷贝。而老旧的不会被拷贝
- follow
- 当拷贝的文件夹内有link存在的时候,那么拷贝过去的也会有link
- force
- 默认为yes,会覆盖远程的内容不一样的文件(可能文件名一样)。如果是no,就不会拷贝文件,如果远程有这个文件
- group
- 设定一个群组拥有拷贝到远程节点的文件权限
- mode
- 等同于chmod,参数可以为“u+rwx or u=rw,g=r,o=r”
- owner
- 设定一个用户拥有拷贝到远程节点的文件权限
- src
- 把复制selinux配置文件
也可以改权限,所属组,或所有者
也可以把内容复制到指定的文件中
[[email protected] ~]# ansible cen7 -m copy -a ‘content="df-h\nhhhhhhhhhhh\nls\n" dest=/app/f1.sh‘ [[email protected] ~]# ansible cen7 -a ‘cat /app/f1.sh‘ 192.168.27.102 | SUCCESS | rc=0 >> df-h hhhhhhhhhhh ls 192.168.27.101 | SUCCESS | rc=0 >> df-h hhhhhhhhhhh ls
ansible srv -m copy -a "src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes"
如目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a "content=‘test content\n‘ dest=/tmp/f1.txt" 利用内容,直接生成目标文件
Cron:计划任务
支持时间:minute,hour,day,month,weekday
ansible srv -m cron -a "minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null‘
name=Synctime" 创建任务
ansible srv -m cron -a ‘state=absent
name=Synctime‘ 删除任务
例1:每五分钟周六周日执行
[[email protected] ~]# ansible cen7 -m cron -a ‘minute=/5 weekday=0,6 job="/usr/bin/wall cront job" name="test"‘
name就是给这个计划任务起个名字
job表示要执行的命令或操作但是命令要写绝对路径
[[email protected] ~]# ansible cen7 -a ‘crontab -l‘
192.168.27.102 | SUCCESS | rc=0 >>
#Ansible: test
/5 * 0,6 /usr/bin/wall cront job
例2:禁用范例1的计划任务
[[email protected] ~]# ansible cen7 -m cron -a ‘disabled=true job="/usr/bin/wall cront job" name=test ‘
必须要job
[[email protected] ~]# ansible cen7 -a ‘crontab -l‘
192.168.27.101 | SUCCESS | rc=0 >>
#Ansible: test
# * /usr/bin/wall cront job
开启是disabled=no
Fetch:从客户端取文件至服务器端,copy相反,目录可先tar
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts‘
例2,将远程主机的passwd文件复制到本机上
[[email protected] ~]# ansible cen7 -m fetch -a ‘src=/etc/passwd dest=/app/‘
这里的src是远程主机的路径,dest是本地路径文件要复制到哪里
在本机会成一个远程主机ip名字的一个目录里面存放着文件
例3.将日志文件打包压缩,并复制到本地主机上
[[email protected] ~]# ansible cen7 -m shell -a ‘tar Jcf /app/log.tar.xz /var/log/*.log‘
[[email protected] ~]# ansible cen7 -m fetch -a ‘src=/app/log.tar.xz dest=/app/‘
有专门的tar模块可以将打包并复制
File:设置文件属性和管理文件
- file模块它包含了文件、文件夹、超级链接类的创立、拷贝、移动、删除操作。
- 常见参数
- follow
- 如果原来的文件是link,拷贝后依旧是link
- force
- 强制执行,没说的
- group
- 设定所属组权限
- mode
- 等同于chmod,参数可以为“u+rwx or u=rw,g=r,o=r”
- owner
- 设定文件的所有者
- path
- 目标路径,也可以用dest,name代替
- src
- 待拷贝文件/文件夹的原始位置。
- state = ile/link/directory/hard/touch/absent
- file代表拷贝后是文件;link代表最终是个软链接;directory代表文件夹;hard代表硬链接;touch代表生成一个空文件;absent代表删除
- follow
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link‘
例1:创建一个空文件
[[email protected] ~]# ansible cen7 -m file -a ‘path=/app/testfile state=touch‘
例2:把范例1创建的文件创建一个软连接
[[email protected] ~]# ansible cen7 -m file -a ‘src=/app/testfile path=/app/testlink state=link‘
[[email protected] ~]# ansible cen7 -a ‘ls -l /app/‘ ansible不支持别名命令
例3:创建一个文件夹,推荐用file模块因为比较稳定
方法一[[email protected] ~]# ansible cen7 -a ‘mkdir /app/mk1‘
方法二[[email protected] ~]# ansible cen7 -m file -a ‘path=/app/mk2 state=directory‘
例4:删除文件夹或文件
[[email protected] ~]# ansible cen7 -m file -a ‘path=/app/mk1 state=absent‘
[[email protected] ~]# ansible cen7 -m file -a ‘path=/app/fstab state=absent‘
例5:清空整个文件夹
[[email protected] ~]# ansible cen7 -m shell -a ‘rm -rf /app/*‘
Hostname:管理主机名这里改名是永久改,会把配置文件改掉
ansible node1 -m hostname -a "name=websrv"
ansible 192.168.27.101 -m hostname -a ‘name=g101.com‘
yum:管理包
-
常用参数
- disable_gpg_check
- 在安装包前检查包,只会影响state参数为present或者latest的时候
- name
- 你需要安装的包的名字,也能如此使用name=python=2.7安装python2.7
- state present/latest/absent
- 用于描述安装包最终状态,present/latest用于安装包,absent用于remove安装包
- update_cache
- 用于安装包前执行更新list,只会影响state参数为present/latest的时候
范例1:安装一个包,做这些一定要yum配置好
[[email protected] ~]# ansible cen7 -m yum -a ‘name=tree state=present‘
name是要安装的包名,
如果是安装的话默认可以不写state=present,默认是安装
当然也可以用命令模块安装或卸载包 - disable_gpg_check
例2:可以安装包最新版
[[email protected] ~]# ansible cen7 -m yum -a ‘name=dstat state=latest‘
例3:也可以一次性安装多个包,包之间用逗号隔开
[[email protected] ~]# ansible cen7 -m yum -a ‘name=httpd,vsftpd state=present‘1
ansible srv -m yum -a ‘name=httpd state=latest‘ 安装
ansible srv -m yum -a ‘name=httpd state=absent‘ 删除
Service:管理服务
-
常用参数
- enabled
- 启动os后启动对应service的选项。使用service模块的时候,enabled和state至少要有一个被定义,设置成开机启动
- name
- 需要进行操作的service名字
- state stared/stoped/restarted/reloaded
- service最终操作后的状态。
范例1启动服务并设置开机启动
[[email protected] ~]# ansible cen7 -m service -a ‘name=httpd state=started enabled=yes‘
这相当于先启动服务,然后在把服务设置成开机启动 - enabled
ansible service 模块一条命令只能支持一个服务,name只能写一个
ansible srv -m service -a ‘name=httpd state=stopped‘
ansible srv -m service -a ‘name=httpd state=started‘
ansible srv –m service –a ‘name=httpd state=reloaded‘
ansible srv -m service -a ‘name=httpd state=restarted‘
User:管理用户
- 常用参数
- home
- 指定用户的家目录
- groups
- 用户的所属组可以指定多个用逗号分隔
- uid
- 指定用户uid
- name
- 要创建的用户名
- createhome
- 是否创建家目录 yes|no
- system
- 是否为系统用户
- remove
- 当state=absent时,remove=yes则表示连同家目录一起删除,等价于userdel -r
- state
- 是创建还是删除,默认是创建
- shell
- 指定用户的shell环境
- password
- 指定用户的密码
- home
-
范例1:创建一个test1用户,uid=2000,主组是guo,附属组是root,bin.指定家目录为根下 还有描述
[[email protected] ~]# ansible cen7 -m user -a ‘name=test1 comment="test is user" uid=2000 home=/test group=guo groups=root,bin‘
例2:创建一个系统用户,系统用户是没有家目录的所以要加上createhome=no不创建家目录,如果不加这个选项则是默认创建家目录
[[email protected] ~]# ansible cen7 -m user -a ‘name=systemuser system=yes createhome=no‘
192.168.27.102 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": false,
"group": 996,
"home": "/home/systemuser", 虽然这里显示是创建的,但是事实是没有创建
"name": "systemuser",
"shell": "/bin/bash",
"state": "present",
"system": true,
"uid": 998
}
例3:删除一个普通用户,包括家目录以前删除当state=absent时remove=yes则表示连同家目录一起删除,如果只选state=absent则只删除用户,而不会删除家目录
[[email protected] ~]# ansible cen7 -m user -a ‘name=test1 state=absent remove=yes‘
ansible srv -m user -a ‘name=user1 comment="test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1 ‘
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘
删除用户及家目录等数据
Group:管理组
- 和user参数一样
-
范例1:创建组
[[email protected] ~]# ansible cen7 -m group -a ‘name=group1‘例2:删除一个组
[[email protected] ~]# ansible cen7 -m group -a ‘name=group1 state=absent‘1ansible srv -m group -a "name=testgroup system=yes"
ansible srv -m group -a "name=testgroup state=absent"
ansible-galaxy
连接 https://galaxy.ansible.com 下载相应的roles
这个网站是官方的,国外的一些大神做的比较好的playbook,和一些角色,会传到这里,可以下载使用或者参考
列出所有已安装的galaxy ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
就将网站上的角色名写着就可以
bash
[[email protected] ~]# ansible-galaxy install geerlingguy.nginx</li>
<li>downloading role ‘nginx‘, owned by geerlingguy</li>
<li>downloading role from " rel="nofollow" target="_blank">https://github.com/geerlingguy/ansible-role-nginx/archive/2.5.0.tar.gz</li>;
<li>extracting geerlingguy.nginx to /root/.ansible/roles/geerlingguy.nginx 这里显示了下载的位置</li>
<li>geerlingguy.nginx (2.5.0) was installed successfully
下载完后可以用ansible-galaxy list 查看
进入目录看一下里面的内容
bash
[[email protected] ~]# ls .ansible/roles/geerlingguy.nginx/
defaults handlers LICENSE meta README.md tasks templates tests vars
这里都是playbook
最好复制一份并改名,这样修改如果出现重大失误可以有参考
删除galaxy
ansible-galaxy remove geerlingguy.redis
ansible-pull
推送命令至远程,效率无限提升,对运维要求较高
Ansible-playbook
ansible-playbook hello.yml 后缀推荐用.yml它是用yml语言写的
ansible-playbook 运行脚本 要用-C 检查一下
语法要求很严格
创建一个空文件的一个脚本
[[email protected] ansible]# vim hellow.yml
-
hosts: cen7
remote_user: roottasks:
- name: test yml
file: name=/app/test12 state=touch
- name: test yml
Ansible-vault
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
bash
[[email protected] ansible]# ansible-vault encrypt hellow.yml
New Vault password:
Confirm New Vault password:
Encryption successful
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 编辑加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 创建新文件
Ansible-console:2.0+新增,可交互执行命令,支持tab
[email protected] (2)[f:10] 执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]执行用户@当前操作的主机组(当前组的主机数量)[f:并发数] 执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]
设置并发数: forks n 例如: forks 10
切换组: cd 主机组 例如: cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help
示例:
bahs
[email protected] (2)[f:5]$ list
[email protected] (2)[f:5]$ cd appsrvs
[email protected] (2)[f:5]$ list
[email protected] (2)[f:5]$ yum name=httpd state=present
[email protected] (2)[f:5]$ service name=httpd state=started