ansible的Host-pattern

ansible的Host-pattern
匹配主机的列表
All :表示所有Inventory中的所有主机
ansible all –m ping
:通配符
ansible “
” -m ping 这个”*”号相当于all全部主机
3.2 企业自动化运维ansible_第1张图片

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

3.2 企业自动化运维ansible_第2张图片

逻辑与
ansible ‘websrvs:&dbsrvs’ –m ping 就是取交集
在websrvs组并且在dbsrvs组中的主机
3.2 企业自动化运维ansible_第3张图片

 逻辑非 

ansible ‘websrvs:!dbsrvs’ –m ping
在websrvs组,但不在dbsrvs组中的主机
3.2 企业自动化运维ansible

综合逻辑
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正则表达式
ansible “websrvs:&dbsrvs” –m ping
ansible “~(web|db).*.magedu.com” –m ping

 ![](https://s1.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=)

 ![](https://s1.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来查看命令执行的详细过程[root@ansible ~]# 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的配置文件里定义的
3.2 企业自动化运维ansible_第4张图片

 绿色:执行成功并且不需要做改变的操作

×××:执行成功并且对目标主机做变更
红色:执行失败

 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

[root@localhost ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

现在在测这个主机
[root@ansible .ssh]# ansible 192.168.27.101 -m ping
192.168.27.101 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
[root@ansible .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进入到某个目录来执行参数
    [root@ansible ~]# 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
[root@ansible ~]# 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
3.2 企业自动化运维ansible_第5张图片

如果文件不存在则不执行

3.2 企业自动化运维ansible_第6张图片

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到远程,执行,再把需要的结果拉回执行命令的机器
查看主机名
[root@ansible ~]# 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也支持条件判断&&||
[root@ansible ~]# 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

[root@ansible ~]# 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:运行脚本

  • 相当于先把脚本传到远方节点,然后在执行
  • 3.2 企业自动化运维ansible_第7张图片

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
      • 设定一个用户拥有拷贝到远程节点的文件权限
  • 把复制selinux配置文件
  • 3.2 企业自动化运维ansible_第8张图片
  • 3.2 企业自动化运维ansible_第9张图片

也可以改权限,所属组,或所有者
3.2 企业自动化运维ansible_第10张图片

3.2 企业自动化运维ansible_第11张图片

也可以把内容复制到指定的文件中

[root@ansible ~]# ansible cen7 -m copy -a 'content="df-h\nhhhhhhhhhhh\nls\n" dest=/app/f1.sh'
[root@ansible ~]# 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:每五分钟周六周日执行

[root@ansible ~]# ansible cen7 -m cron -a 'minute=/5 weekday=0,6 job="/usr/bin/wall cront job" name="test"'
name就是给这个计划任务起个名字
job表示要执行的命令或操作但是命令要写绝对路径
[root@ansible ~]# ansible cen7 -a 'crontab -l'
192.168.27.102 | SUCCESS | rc=0 >>
#Ansible: test
/5 * 0,6 /usr/bin/wall cront job

例2:禁用范例1的计划任务

[root@ansible ~]# ansible cen7 -m cron -a 'disabled=true job="/usr/bin/wall cront job" name=test '
必须要job
[root@ansible ~]# 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文件复制到本机上

[root@ansible ~]# ansible cen7 -m fetch -a 'src=/etc/passwd dest=/app/'
这里的src是远程主机的路径,dest是本地路径文件要复制到哪里
在本机会成一个远程主机ip名字的一个目录里面存放着文件

例3.将日志文件打包压缩,并复制到本地主机上
[root@ansible ~]# ansible cen7 -m shell -a 'tar Jcf /app/log.tar.xz /var/log/*.log'
[root@ansible ~]# 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代表删除

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:创建一个空文件
[root@ansible ~]# ansible cen7 -m file -a 'path=/app/testfile state=touch'

例2:把范例1创建的文件创建一个软连接
[root@ansible ~]# ansible cen7 -m file -a 'src=/app/testfile path=/app/testlink state=link'
[root@ansible ~]# ansible cen7 -a 'ls -l /app/' ansible不支持别名命令

例3:创建一个文件夹,推荐用file模块因为比较稳定
方法一[root@ansible ~]# ansible cen7 -a 'mkdir /app/mk1'
方法二[root@ansible ~]# ansible cen7 -m file -a 'path=/app/mk2 state=directory'

例4:删除文件夹或文件
[root@ansible ~]# ansible cen7 -m file -a 'path=/app/mk1 state=absent'
[root@ansible ~]# ansible cen7 -m file -a 'path=/app/fstab state=absent'

例5:清空整个文件夹
[root@ansible ~]# 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配置好
    [root@ansible ~]# ansible cen7 -m yum -a 'name=tree state=present'
    name是要安装的包名,
    如果是安装的话默认可以不写state=present,默认是安装
    当然也可以用命令模块安装或卸载包

例2:可以安装包最新版
[root@ansible ~]# ansible cen7 -m yum -a 'name=dstat state=latest'

例3:也可以一次性安装多个包,包之间用逗号隔开

[root@ansible ~]# 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启动服务并设置开机启动
    [root@ansible ~]# ansible cen7 -m service -a 'name=httpd state=started enabled=yes'
    这相当于先启动服务,然后在把服务设置成开机启动

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
      • 指定用户的密码
  • 范例1:创建一个test1用户,uid=2000,主组是guo,附属组是root,bin.指定家目录为根下 还有描述

    [root@ansible ~]# ansible cen7 -m user -a 'name=test1 comment="test is user" uid=2000 home=/test group=guo groups=root,bin'

    例2:创建一个系统用户,系统用户是没有家目录的所以要加上createhome=no不创建家目录,如果不加这个选项则是默认创建家目录
    [root@ansible ~]# 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则只删除用户,而不会删除家目录
[root@ansible ~]# 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:创建组
    [root@ansible ~]# ansible cen7 -m group -a 'name=group1'

    例2:删除一个组
    [root@ansible ~]# ansible cen7 -m group -a 'name=group1 state=absent'1

    ansible 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,和一些角色,会传到这里,可以下载使用或者参考
3.2 企业自动化运维ansible_第12张图片

    列出所有已安装的galaxy 
 ansible-galaxy list

安装galaxy
ansible-galaxy install geerlingguy.redis

就将网站上的角色名写着就可以
bash
[root@ansible ~]# ansible-galaxy install geerlingguy.nginx

  • downloading role 'nginx', owned by geerlingguy

  • downloading role from https://github.com/geerlingguy/ansible-role-nginx/archive/2.5.0.tar.gz
  • ;
  • extracting geerlingguy.nginx to /root/.ansible/roles/geerlingguy.nginx 这里显示了下载的位置

  • geerlingguy.nginx (2.5.0) was installed successfully

    下载完后可以用ansible-galaxy list 查看
    进入目录看一下里面的内容
    bash
    [root@ansible ~]# 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语言写的

    3.2 企业自动化运维ansible_第13张图片

    ansible-playbook 运行脚本 要用-C 检查一下
    语法要求很严格

    创建一个空文件的一个脚本

    [root@ansible ansible]# vim hellow.yml

    • hosts: cen7
      remote_user: root

      tasks:

      • name: test yml
        file: name=/app/test12 state=touch

    Ansible-vault

    功能:管理加密解密yml文件
    ansible-vault [create|decrypt|edit|encrypt|rekey|view]
    ansible-vault encrypt hello.yml 加密
    bash
    [root@ansible 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
    root@test (2)[f:10] 执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]执行用户@当前操作的主机组(当前组的主机数量)[f:并发数] 执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]
    设置并发数: forks n 例如: forks 10
    切换组: cd 主机组 例如: cd web
    列出当前组主机列表: list
    列出所有的内置命令: ?或help
    示例:
    bahs
    root@all (2)[f:5]$ list
    root@all (2)[f:5]$ cd appsrvs
    root@appsrvs (2)[f:5]$ list
    root@appsrvs (2)[f:5]$ yum name=httpd state=present
    root@appsrvs (2)[f:5]$ service name=httpd state=started
    3.2 企业自动化运维ansible_第14张图片