Ansible命令执行过程
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常用模块
Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功
此命令不支持 $VARNAME < > | ; & 等,用shell模块
ansible dbsever -m command -a 'chdir /etc creates/data/file1.txt cat /centos-release '
#查看 dbserver下的主机的 系统版本,前进入/etc目录,如果file1.txt,文件不存在 将会执行
Shell:和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到远程,执行,再把需要的结果拉回执 行命令的机器
备注:可以进配置文件[/etc/ansible/ansible.cfg]文件中修改module_name=shell 来修改默认模块
Script:运行脚本
-a "/PATH/TO/SCRIPT_FILE“
ansible dbserver -m script -a f1.sh
Copy:从服务器复制文件到客户端,
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” 利用内容,直接生成目标文件
Fetch:从客户端取文件至服务器端,copy相反,目录可先tar
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
File:设置文件属性
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’
unarchive:解压缩包
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2、将远程主机上的某个压缩包解压至指定路径下,设置copy=no
常见参数:
copy:默认为Yes,拷贝的文件是从ansible主机复制到远程服务器,如果设置为no,会砸死远程服务器上寻找src源文件
remote_src:和copy功能一样互斥,yes表示在远程主机,不在ansible主机,no表示在ansible主机
src:源路径,可以是ansilble主机上的路径,也可以是远程主机上的路径如果是远程主机上的路径copy=no
ansible src -m unarchive -a 'src=/data/test.tar.gz dest=/var/test/'
ansible src -m unarchive -a 'src=/data/test.tar.gz dest=/var/test/' copy=no mode=0777'
Archive:打包压缩
ansible dbserver -m archive -a 'path=/var/log/ dest=/data/log.tag.bz2 format=bz2'
Hostname::管理主机名
ansible node1 -m hostname -a “name=websrv”
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’ 删除任务
创建任务
ansible dbserver -m cron -a 'hour=2 minute=30 weekday=1-5 name="bakup mysql" job=/root/mysql_backup.sh'
#每周的星期1至星期五的2点30份在dbserver主机组,执行mysql_bachk.sh脚本
ansible dbserver -m cron -a "minute=*/5" job='/usr/sbin/ntpdate 17.20.0.1 &>/dev/null name=Synctime"
禁用任务
ansible dbserver -m cron -a "minute=*/5" job='/usr/sbin/ntpdate 17.20.0.1 &>/dev/null name=Synctime disabled=yes"
启用任务
ansible dbserver -m cron -a "minute=*/5" job='/usr/sbin/ntpdate 17.20.0.1 &>/dev/null name=Synctime disabled=no"
####################
crontab -l 查看计划任务
Yum:管理包
ansible srv -m yum -a ‘name=httpd state=latest’ 安装
ansible srv -m yum -a ‘name=httpd state=absent’ 删除
Service:管理服务
ansible srv -m service -a 'name=httpd state=stopped '
ansible srv -m service -a 'name=httpd state=started enabled=yes' #启动服务,并设置开机启动
ansible srv –m service –a ‘name=httpd state=reloaded’
ansible srv -m service -a 'name=httpd state=restarted
User:管理用户
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:管理组
ansible srv -m group -a "name=testgroup system=yes“
ansible srv -m group -a "name=testgroup state=absent"
Lineinfile:相当于sed,可以修改文件内容
ansible在使用sed进行替换时,经常会遇到转义的问题,而且ansible在遇到特殊符号进行替换时经常出现问题,所以ansible提供了2个模块,lineinfle和replace模块,方便替换。
ansible all -m lineinfile -a "path=/etc/selinux/config" regexp=' ^SELINUX=' line='SELINUX=enforcing' "
#找出以SELINUX=开头的行,替换成'SELINUX=enforcing
ansible all -m lineinfile -a 'dest=/etc/fstab.txt state=absent regexp="^#"'
删除带#的行
Replace:主要是基于正则进行匹配和替换
ansible dbserver -m replace -a 'path=/etc/foo.txt regexp="^(UUID.*)" replace="#\1"'
#以UUID开头的行加 了注释
Setup:收集远程主机的信息,例如:IP地址,硬件信息,等
ansible dbserver -m setup
ansible系列命令
ansible-galaxy :连接 https://galaxy.ansible.com 下载相应的roles
列出所有安装的galaxy:ansible-galaxy list
安装galaxy:ansible-galaxy install geerlingguy.redis
删除galaxy:nasible-galaxy remove geerlingguy.redis
示例:向被控端发送 Hello world
#hello world yml file
- hosts: dbserver
remote_user: root
tasks:
- name: hello world
command: /usr/bin/wall hello world
#缩进很重要
ansible-playbook hello.yml
Ansible-vault:管理加密解密yml文件,解密后才可执行
ansible-vault encrypt hello.yml 加密
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 创建新文件