ansible常用选项参数:

  -a    模块的参数,如果执行默认COMMAND的模块,即是命令参数,如:“date”,"pwd"等等
  -k   ask for SSH password  登录密码,提示输入SSH密码而不是假设基于密钥的验证
  -m   执行模块的名字,所以如果是只执行单一命令可以不用 -m参数

ansiblet通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible <host_pattern> [-m module_name] [-a args]

  -m module 指定模块,默认为command
  -v 详细过程 -vv -vvv更详细
  --list-hosts  显示主机列表,可简写—list
  -k, --ask-pass  提示输入ssh连接密码,默认key验证
  -K, --ask-become-pass  提示输入sudo时的口令
  -C, --check  检查,并不换行
  -T, --timeout=TIMEOUT执行命令的超时时间,默认10s
  -u, --user=REMOTE_USER 执行远程执行的用户
  -b, --become 代替旧版的sudo切换

ansible系列命令

ansible ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull

ansible-doc:显示模块帮助

  ansible-doc [options] [module…]

  -a       显示所有模块的文档
  -l, --list      列出可用模块
  -s, --snippet     显示指定模块的playbook代码段

示例:

ansible-doc -l       列出所有模块
ansible-doc ping   查看指定模块帮助用法
ansible-doc -s ping     查看指定模块参数用法

密钥认证

可查看:

ssh-keygen

ssh-copy-id 10.24.45.12

ssh-copy-id 10.24.45.14

ssh-copy-id 10.24.45.15

#yum -y install openssh-clients(解决:ssh-copy-id:command not found问题)

ansible的Host-pattern

匹配主机的列表
all:   表示所有inventory中的主机
       ansible all -m ping
*:     通配符
       ansible “*” -m ping
       ansible 10.10.1.* -m ping
       ansible “*srvs” -m ping
或关系:
       ansible “web:app” -m ping
       ansible “10.10.1.10:10.10.1.20” -m ping
逻辑与:
       ansible “web:&app” -m ping
       #在web组并且在app组中的主机
逻辑非:
       ansible ‘web:!app’ -m ping
       #在web组中但不在app组中的主机
       #注意:此处为单引号
综合逻辑:
       ansible ‘web:app:&db:!ftp’ -m ping
       #这里也是单引号
正则表达式:
       ansible “web:&app” -m ping
       ansible “~(web|app).&\.cjk\.com” -m ping

ansible命令执行后过程

  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使用示例

以cjk用户执行ping存活检测
       ansible all -m ping -u cjk -k
以cjk sudo至root执行ping存活检测
       ansible all -m ping -u cjk -b -k
以cjk sudo至 benn用户执行ping存活检测
       ansible all -m ping -u cjk -b -k –become-user benn
以cjk sudo 至root用户执行 ls
       ansible all -m shell -u cjk –become-user=root -a ‘ls /root’ -b -k -K

ping模块演示:

先对主机清单管理文件配置

tail /etc/ansible/hosts

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录

#如果没有做密钥认证且在hosts配置文件里如上图IP为10.24.45.14没有填写服务器对应的用户名和密码在执行ansible命令时要加参数-k;

ansible常用模块

1、command:在远程主机执行命令,默认模块,可忽略-m选项

       ansible db -m command -a ‘service vsftpd start’

       ansible db -m command -a ‘echo 123456 |passwd –stdin cjk’ 不成功

       #此命令不支持$VARNAME < > | ; &等,需要用shell模块实现

2、shell:和command相似,用shell执行命令

    ansible db -m shell “echo 123456 |passwd -stdin cjk”

       调用bash执行命令类似cat /tmp/cjk.log |awk -F’/’ ‘{print $1,$2}’ & > /tmp/cjk.txt这些复杂命令时,即使使用shell也可能会失败,解决方法:写道脚本,copy到远程执行,再把需要的结果拉回执行命令的机器

 3、script:运行脚本

       -a “PATH/TO/SCRIPT_FILE”

       ansible db -m script -a f1.sh

 

4、remove如果文件不存在就不执行后面的命令;

5、creates 如果文件存在反而不执行后面的命令。

ansible test -a 'removes=/etc/fs cat /root/s1.sh'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_02

给目标服务器创建一个空文件:

ansible test -a 'creates=/etc/fs cat /root/s1.sh'

ansible uri模块 登录 ansible user模块 password_服务器_03

查看目标服务器主机名:

ansible test -a 'echo $HOSTNAME'

ansible test -m shell -a 'echo $HOSTNAME'

ansible uri模块 登录 ansible user模块 password_推送_04

#比较默认的command模块和shell模块执行带特殊字符的命令结果,shell模块弥补了command模块不能准确执行特殊字符的缺陷,功能比command更强大。

创建用户并设置密码:

ansible test -a 'useradd cjk'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_05

#script:模块不需要把脚本先推送到所有主机,只需要在管理端ansible服务器上把脚本写好自动就能让所有主机执行。(如果使用command模块则需要先把脚本推送到所有服务器上才能执行)

echo -e "#! /bin/bash\nhostname" >/root/s1.sh

chmod +x s1.sh

ansible test -m script -a '/root/s1.sh'

ansible uri模块 登录 ansible user模块 password_服务器_06

6、copy:从服务器复制文件到客户端

 ansible db -m copy -a ‘src=/root/f1.sh dest=/tmp.f2.sh owner=cjk mode=600 backup=yes’

  #backup=yes表示copy前先备份

7、fetch:从客户端取文件到服务器端,copy相反,目录可先tar

  ansible db -m fetch -a ‘src=/root/a.sh dest=/data/scripts’

8、file: 设置文件属性

  ansible db -m file -a ‘path=/root/a.sh owner=cjk mode=755’

  ansible db -m file -a ‘src=/app/testfile dest=/app/testfile-link state=lind’

  #state表示执行动作

使用copy模块,并设置权限和所有者:

ansible test -m copy -a 'src=/root/s2.sh dest=/data/ mode=000 owner=cjk'

ansible uri模块 登录 ansible user模块 password_推送_07

查看目标服务器/data/目录:

ansible test -a 'ls -l /data/'

ansible uri模块 登录 ansible user模块 password_推送_08

#fetch测试,抓取远程文件到ansible管理端(目前版本只能复制单个文件,不能抓取目录,但是我们可以把想要抓取的多个文件打一个包,这样就可以满足我们的需求

ansible test -m fetch -a 'src=/var/log/messages dest=/data/logs'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_09

ansible uri模块 登录 ansible user模块 password_nginx_10

远程打包:

ansible test -m shell -a 'tar Jcf /root/log.tar.xz /var/log/*.log'

ansible uri模块 登录 ansible user模块 password_服务器_11

注意:标黄部分提示有专门的打包模块“unarchive”,事实上通过执行ansible-doc -s unarchiv命令,你会发现这个是解包模块,打包模块是“archive”

把打好的包拉回ansible服务器:

ansible test -m fetch -a 'src=/root/log.tar.xz dest=/data/'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_12

查看打包内容:

ansible uri模块 登录 ansible user模块 password_nginx_13

file模块演示

建立一个新文件(name和dest是path的别名,都可用)

ansible test -m file -a 'name=/data/f1 state=touch'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_14

删除文件用absent:

ansible test -m file -a 'name=/data/f1 state=absent'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_15

创建目录用directory;删除目录还是absent:

ansible test -m file -a 'name=/data/d1 state=directory'

# ansible test -m file -a 'name=/data/d1 state=absent'

ansible uri模块 登录 ansible user模块 password_nginx_16

创建软链接用link;删除还是absent:

ansible test -m file -a 'src=/etc/fstab name=/data/fstab.link state=link'

ansible uri模块 登录 ansible user模块 password_nginx_17

删除软连接:

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_18

#删除一个目录下所有文件直接用rm -rf。

ansible test -m shell -a 'rm -fr /data/*'

ansible uri模块 登录 ansible user模块 password_推送_19

Hostname: 管理主机名

  ansible node1 -m hostname -a “name=www”

Cron: 计划任务

  支持时间:minute,hour,day,month,weekday

  ansible db -m cron -a “minute=*/5 job=’/usr/sbin/ntpdate 172.160.1 &>/dev/null’ name=synctime” //创建任务

ansible db -m cron -a ‘state=absent name=synctime’    //删除任务

Yum: 管理包

  ansible db -m yum -a ‘name=httpd state=latest’        //安装

  ansible db -m yum -a ‘name=httpd state=absent’      //删除

#hostname模块改主机名可以立即生效,而且能自动把配置文件替换(但是只能单台修改):

cron模块演示(添加一个定时任务):

ansible test -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/cjk FBI warning" name=warningcron state=absent'

ansible uri模块 登录 ansible user模块 password_nginx_20

禁用cron(加注释:disabled=true),再启动就把true改成false

ansible test -m cron -a 'disabled=true job="/usr/bin/cjk FBI warning" name=warningcron state=absent'

ansible uri模块 登录 ansible user模块 password_推送_21

查看定时任务内容:

ansible test -a 'crontab -l'

ansible uri模块 登录 ansible user模块 password_nginx_22

删除还是用absent

ansible test -m cron -a 'job="/usr/bin/cjk FBI warning" name=warningcron state=absent'

ansible uri模块 登录 ansible user模块 password_nginx_23

#yum模块演示(前提要在做系统的时候装好yum源,ansible执行安装的时候比较慢):

ansible test -m yum -a 'name=vsftpd'

ansible uri模块 登录 ansible user模块 password_推送_24

卸载还是用absent或者remove:

ansible test -m service -a 'name=vsftpd state=absent'

ansible uri模块 登录 ansible user模块 password_推送_25

查看是否安装成功:

ansible test -m shell -a 'rpm -aq vsftpd'

ansible uri模块 登录 ansible user模块 password_服务器_26

安装多个包(中间用,(逗号)隔开,卸载同理):

ansible test -m yum -a 'name=memcache,httpd,mysql-server,php*'

ansible uri模块 登录 ansible user模块 password_推送_27

安装包远程安装(不能直接装,需要先推送到目标机器再yum安装):

ansible test -m yum -a 'name=/root/logstash-6.5.4.rpm'

ansible uri模块 登录 ansible user模块 password_nginx_28

Service: 管理服务

  ansible db -m service -a ‘name=httpd state=stopped’
  ansible db -m service -a ‘name=httpd state=started
  ansible db -m service -a ‘name=httpd state=reloaded’
  ansible db -m service -a ‘name=httpd state=restarted

User: 管理用户

  ansible db -m user -a ‘name=user1 comment=”test user” uid=2019 home=/app/user1 group=root’
  ansible db -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1’
  ansible db -m user -a ‘name=user1 state=absent remove=yes’    //删除用户及家目录等数据

Group: 管理组

  ansible db -m group -a “name=testgroup system=yes”
  ansible db -m group -a “name=testgroup state=absent”

启动一个服务并设置开机自启:

ansible test -m service -a 'name=vsftpd state=started enabled=yes'  

#ansible test -m service -a 'name=vsftpd state=stopped enabled=no'

#state和enabled可以单独执行;yes还可以用true或者no代替;

目标服务器测试启动结果如下:

ansible uri模块 登录 ansible user模块 password_推送_29

user模块使用:(system指系统用户,home指家目录,comment:描述)

ansible test -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/home/nginx groups=root,bin uid=80 comment="nginx service"'

ansible uri模块 登录 ansible user模块 password_nginx_30

查看目标服务器是否创建成功:

ansible test -a 'getent passwd nginx'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_31

#getent 用来察看系统的数据库中的相关记录

删除用户:

ansible test -m user -a 'name=nginx state=absent remove=yes'

#注意这里删除的时候absent和remove同时使用。

group模块使用:

ansible test -m group -a 'name=nginx system=yes gid=80'

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_32

验证:

ansible test -a 'getent group nginx'

ansible uri模块 登录 ansible user模块 password_推送_33

删除group:

ansible test -m group -a 'name=nginx state=absent'

ansible uri模块 登录 ansible user模块 password_nginx_34

 

ansible-galaxy

  连接https://galay.ansible.com下载相应的roles

  列出所有已安装的galaxy
       ansible-galaxy list
  安装galaxy
       ansible-galaxy install geerlingguy.redis
  删除galaxy
      ansible-galaxy remove geerlingguy.redis

ansible uri模块 登录 ansible user模块 password_推送_35

安装galaxy-nginx:

ansible-galaxy install geerlingguy.nginx

ansible uri模块 登录 ansible user模块 password_推送_36

注意上面报错提示使用参数: --ignore-errors

# ansible-galaxy --ignore-errors install geerlingguy.nginx

进入nginx目录下,查看tasks/main.yml内容实际上就是ansible模块组成的剧本

ansible uri模块 登录 ansible user模块 password_ansible uri模块 登录_37

还可以修改角色名称:

ansible uri模块 登录 ansible user模块 password_推送_38

删除galaxy角色:

ansible-galaxy remove geerlingguy.nginx/

ansible-pull

  推送命令至远程,效率无限提升,对运维要求较高