[关闭]
@zhangyy 2021-09-17T17:41:54.000000Z 字数 8780 阅读 199

ansible 的使用(三)

ansible系列


一:Ansible常用模块

1.1 ansible的模块

  1. 2015年底270多个模块,2016年达到540个,20180112日有1378个模块,201807151852个模块,20190525日(ansible 2.7.10)时2080个模块,20200302日有3387个模块
  2. 虽然模块众多,但最常用的模块也就230个而已,针对特定业务只用10几个模块
  3. 常用模块帮助文档参考:
  4. https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

1.2 Command 模块

  1. 功能:在远程主机执行命令,此为默认模块,可忽略-m选项
  2. 注意:此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
  3. ansible-doc -s command

image_1ffp3a94l33gff510201b47bqa1t.png-153.9kB


  1. 范列:
  2. ansible websrvs -m commnad -a "cat /etc/redhat-release"
  3. ansible dbsrvs -m command -a "free -g"
  4. ansible websrvs -m command -a 'chdir=/etc cat issue'
  5. ansible websrvs -m command -a 'chdir=/etc creates=/data/f1.txt
  6. cat centos-release' [文件不存在就执行,文件存在不执行]
  7. #ansible websrvs -m command -a 'chdir=/etc removes=/data/f1.txt
  8. cat centos-release'

image_1ffp2eo841ldh1gf03ro1an617c39.png-101.1kB

image_1ffp2fkouc5dq7d1s9p17u81o5qm.png-84.7kB

image_1ffp2ume81dlv27l2cd1aoc41m1g.png-97.1kB

  1. ansible websrvs -m command -a service vsftpd start
  2. 执行有问题:
  3. ansible websrvs -m command -a 'rm -rf /data/'
  4. ansible websrvs -m command -a 'echo hello > /data/hello.log'
  5. ansible websrvs -m command -a "echo $HOSTNAME"

image_1ffp2m5bv1skaqq6vmd1rg6kv313.png-87kB

1.3 shell 模块

  1. Shell模块
  2. 功能:和command相似,用shell执行命令
  3. 注意:此模块不具有幂等性
  4. 范例:
  5. ansible websrvs -m shell -a "echo $HOSTNAME"
  6. ansible websrvs -m shell -a "useradd test && echo test |passwd test --stdin"
  7. ansible websrvs -m shell -a "id test"

image_1ffp4i9v119mk6bk1ldu1kl315a42a.png-283.7kB

image_1ffp4j5cr17p51ij7153n1kpu9va2n.png-96.5kB

  1. 注意:调用bash执行命令 类似 cat /tmp/test.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt
  2. 些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的
  3. 结果拉回执行命令的机器
  4. 范例:将shell模块代替command,设为模块
  5. [root@ansible ~]#vim /etc/ansible/ansible.cfg
  6. #修改下面一行
  7. module_name = shell

1.4 script 模块

  1. 功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
  2. 注意:此模块不具有幂等性
  3. ansible websrvs -m script -a /root/test.sh

image_1ffp577611b9sk6h3rnhau11l534.png-177.7kB

1.5 copy 模块

  1. 功能:从ansible服务器主控端复制文件到远程主机
  2. 注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
  3. #如目标存在,默认覆盖,此处指定先备份
  4. ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=wang mode=600 backup=yes"
  5. #指定内容,直接生成目标文件
  6. ansible websrvs -m copy -a "content='test line1\ntest line2\n'
  7. dest=/tmp/test.txt"
  8. #复制/etc目录自身,注意/etc/后面没有/
  9. ansible websrvs -m copy -a "src=/etc dest=/backup"
  10. #复制/etc/下的文件,不包括/etc/目录自身,注意/etc/后面有/
  11. ansible websrvs -m copy -a "src=/etc/ dest=/backup"
  12. ansible websrvs -m copy -a "src=/root/test.sh dest=/root/a.sh owner=zhangyy mode=600 backup=yes"

image_1ffp5ilsomj05ir15fm281u1h3h.png-153.5kB

1.6 fetch 模块

  1. 功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
  2. 范例:
  3. ansible websrvs -m fetch -a 'src=/etc/redhat-release dest=/root/os'

image_1ffp5mkqd1f7khq21nin1bb91f5m3u.png-203.4kB

image_1ffp5oe3f1n7r6be113uq931ors4b.png-79.7kB

1.7 File 模块

  1. 功能:设置文件属性,创建软链接等
  2. 范例:
  3. #创建空文件
  4. ansible all -m file -a 'path=/root/test.txt state=touch' 创建
  5. ansible all -m file -a 'path=/root/test.txt state=absent' 删除
  6. ansible all -m file -a "path=/root/test.sh owner=zhangyy mode=755" 改文件所有者
  7. #创建目录
  8. ansible all -m file -a "path=/root/mysql state=directory owner=mysql group=mysql"
  9. #创建软链接
  10. ansible all -m file -a 'src=/data/testfile path|dest|name=/data/testfile-link
  11. state=link'
  12. #创建目录
  13. ansible all -m file -a 'path=/data/testdir state=directory'
  14. #递归修改目录属性,但不递归至子目录
  15. ansible all -m file -a "path=/data/mysql state```
  16. =directory owner=mysql
  17. group=mysql"
  18. #递归修改目录及子目录的属性
  19. ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"

image_1ffp6a56t1mn2mhm2eq1s3t1j6p5o.png-158.4kB

1.8 unarchive 模块

  1. 功能:解包解压缩
  2. 实现有两种用法:
  3. 1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
  4. 2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
  5. 常见参数:
  6. copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为
  7. copy=no,会在远程主机上寻找src源文件
  8. remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible
  9. 主机上
  10. src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果
  11. 是远程主机上的路径,则需要设置copy=no
  12. dest:远程主机上的目标路径
  13. mode:设置解压缩后的文件权限
  14. ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo owner=wang
  15. group=bin'
  16. ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
  17. ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data
  18. copy=no'
  19. ansible websrvs -m unarchive -a
  20. 'src=https://releases.ansible.com/ansible/ansible-2.1.6.0-0.1.rc1.tar.gz
  21. dest=/root/ owner=root remote_src=yes'
  22. ansible websrvs -m unarchive -a 'src=http://nginx.org/download/nginx-
  23. 1.18.0.tar.gz dest=/usr/local/src/ copy=no'
  24. ansible all -m unarchive -a "src=/root/os.tar.gz dest=/root owner=zhangyy mode=777"
  25. ansible websrvs -m unarchive -a 'src=https://releases.ansible.com/ansible/ansible-2.1.6.0-0.1.rc1.tar.gz dest=/root/ owner=root remote_src=yes'

image_1ffp6m24d14elpqnmc01lur9765.png-139.4kB

image_1ffp6qek69k61cp215d23qiaj66i.png-138.7kB

1.9 Archive 模块

  1. 功能:打包压缩保存在被管理节点
  2. ansible websrvs -m archive -a 'path=/var/log/ dest=/root/log.tar.gz format=gz
  3. owner=wang mode=0600'
  4. ansible 192.168.100.11 -m archive -a "path=/root/flyfish dest=/root/flyfish.tar.gz format=gz owner=zhangyy mode=600"
  5. ansible 192.168.100.14 -m archive -a "path=/root/flyfish dest=/root/flyfish.tar.gz format=gz owner=zhangyy mode=600"

image_1ffp7q4s3jh51efm11t0102m55i6v.png-143.7kB

image_1ffp7r3s01to68ij1dcv1l1g1h857c.png-128kB

1.10 Hostname 模块

  1. 功能:管理主机名
  2. 范例:
  3. ansible node1 -m hostname -a "name=websrv"
  4. ansible 192.168.100.14 -m hostname -a 'name=node18.flyfish.com'
  5. ansible 192.168.100.14 -m hostname -a 'name=node04.flyfish.com'

image_1ffp7vb1mbe4h786271qrm1fee7s.png-87kB

1.11 Cron 模块

  1. 功能:计划任务
  2. 支持时间:minutehourdaymonthweekday
  3. #备份数据库脚本
  4. [root@centos8 ~]#cat /root/mysql_backup.sh
  5. #!/bin/bash
  6. mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip >
  7. /data/mysql_`date +%F_%T`.sql.gz
  8. #创建任务
  9. ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql"
  10. job=/root/mysql_backup.sh'
  11. ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate ntp.aliyun.com
  12. &>/dev/null' name=Synctime"
  13. #禁用计划任务
  14. ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1
  15. &>/dev/null' name=Synctime disabled=yes"
  16. #启用计划任务
  17. ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1
  18. &>/dev/null' name=Synctime disabled=no"
  19. #删除任务
  20. ansible websrvs -m cron -a "name='backup mysql' state=absent"
  21. ansible websrvs -m cron -a 'state=absent name=Synctime'

1.12 yum 模块

  1. 功能:
  2. yum 管理软件包,只支持RHELCentOSfedora,不支持Ubuntu其它版本
  3. apt 模块管理 Debian 相关版本的软件包
  4. ansible websrvs -m yum -a 'name=httpd state=present' #安装
  5. ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel' #启用epel源
  6. 进行安装
  7. ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #升级除
  8. kernelfoo开头以外的所有包
  9. ansible websrvs -m yum -a 'name=httpd state=absent' #删除
  10. [root@ansible ~]#ansible websrvs -m yum -a 'name=sl,cowsay'
  11. 范例:
  12. [root@ansible ~]#ansible websrvs -m yum -a
  13. "name=https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/5.2/rhel/7/x86_64/zabbix-agent-5.2.5-1.el7.x86_64.rpm"

image_1ffp8qvnmejt126t14rr9k01ug089.png-209.1kB


  1. 范例:
  2. [root@centos8 ~]#ansible 10.0.0.100 -m apt -a
  3. 'name=bb,sl,cowsay,cmatrix,oneko,hollywood,boxes,libaa-bin,x11-apps'
  4. [root@centos8 ~]#ansible websrvs -m apt -a 'name=rsync,psmisc state=absent'

  1. 范例: 查看包
  2. [root@ansible ~]#ansible localhost -m yum -a "list=tree"
  3. localhost | SUCCESS => {
  4.    "ansible_facts": {
  5.        "pkg_mgr": "dnf"
  6.   },
  7.    "changed": false,
  8.    "msg": "",
  9.    "results": [
  10.       {
  11.            "arch": "x86_64",
  12.            "epoch": "0",
  13.            "name": "tree",
  14.            "nevra": "0:tree-1.7.0-15.el8.x86_64",
  15.            "release": "15.el8",
  16.            "repo": "@System",
  17.            "version": "1.7.0",
  18.            "yumstate": "installed"
  19.       },
  20.       {
  21.            "arch": "x86_64",
  22.            "epoch": "0",
  23.            "name": "tree",
  24.            "nevra": "0:tree-1.7.0-15.el8.x86_64",
  25.            "release": "15.el8",
  26.            "repo": "BaseOS",
  27.            "version": "1.7.0",
  28.            "yumstate": "available"
  29.       }
  30.   ]
  31. }

image_1ffp8urrekscp211s79170v6078m.png-118.8kB

image_1ffp90ac3m4ljvt1qs36ia3o593.png-108.7kB

1.13 services 模块

  1. 功能:管理服务
  2. 范例:
  3. ansible all -m service -a 'name=httpd state=started enabled=yes'
  4. ansible all -m service -a 'name=httpd state=stopped'
  5. ansible all -m service -a 'name=httpd state=reloaded'
  6. ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/'
  7. /etc/httpd/conf/httpd.conf"
  8. ansible all -m service -a 'name=httpd state=restarted'

image_1ffp98agc2rctqt1eoq18g1n2l9g.png-154kB

1.14 user 模块

  1. User 模块:
  2. 功能:管理用户
  3. 范例:
  4. #创建用户
  5. ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1
  6. group=root'
  7. ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx
  8. groups="root,daemon" shell=/sbin/nologin system=yes create_home=no
  9. home=/data/nginx non_unique=yes'
  10. #remove=yes表示删除用户及家目录等数据,默认remove=no
  11. ansible all -m user -a 'name=nginx state=absent remove=yes'
  12. ansible all -m user "name=test1 uid=2345 home=/home/test1 group=root"
  13. ansible all -m user -a "name=test1 state=absent remove=yes"

image_1ffp9ptdecng1seluvn4591hp69t.png-114.1kB

image_1ffpbn3931uoq10ra1voe1lkokf9ad.png-126.7kB

1.15 Group 模块

  1. 功能:管理组
  2. 范例:
  3. #创建组
  4. ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
  5. #删除组
  6. ansible websrvs -m group -a 'name=nginx state=absent'

image_1ffpfjmjna5scg5be91c101g65aq.png-152.3kB

1.16 Lineinfile 模块

  1. ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,
  2. 存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可
  3. 以方便的进行替换
  4. 一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块
  5. regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最
  6. 后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被
  7. 删除。
  8. 如果想进行多行匹配进行替换需要使用replace模块
  9. 功能:相当于sed,可以修改文件内容
  10. 范例:
  11. ansible websrvs -m lineinfile -a "path=/etc/httpd/conf/httpd.conf
  12. regexp='^Listen' line='Listen 80'"
  13. ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX='
  14. line='SELINUX=disabled'"
  15. ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'

image_1ffpga9ammpq9udg9f1pp410ekb7.png-178.3kB

image_1ffpgbb313n6qo8tvmcsk1gkobk.png-121.5kB

1.17 Replace 模块

  1. 该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用
  2. 范例:
  3. ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
  4. ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"

image_1ffpgkb8219fe1gp02ukgm77m3c1.png-138.7kB

image_1ffpgkoub1k3bj16ldb19jcq36ce.png-126.4kB

1.18 Setup 模块

  1. 功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机
  2. 较多,会影响执行速度
  3. 可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息
  4. 范例:
  5. ansible all -m setup
  6. ansible all -m setup -a "filter=ansible_nodename"
  7. ansible all -m setup -a "filter=ansible_hostname"
  8. ansible all -m setup -a "filter=ansible_domain"
  9. ansible all -m setup -a "filter=ansible_memtotal_mb"
  10. ansible all -m setup -a "filter=ansible_memory_mb"
  11. ansible all -m setup -a "filter=ansible_memfree_mb"
  12. ansible all -m setup -a "filter=ansible_os_family"
  13. ansible all -m setup -a "filter=ansible_distribution_major_version"
  14. ansible all -m setup -a "filter=ansible_distribution_version"
  15. ansible all -m setup -a "filter=ansible_processor_vcpus"
  16. ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
  17. ansible all -m setup -a "filter=ansible_architecture"
  18. ansible all -m setup -a "filter=ansible_uptime_seconds"
  19. ansible all -m setup -a "filter=ansible_processor*"
  20. ansible all -m setup -a 'filter=ansible_env'

image_1ffphcoc6lps1q3p4fta5ag3dcr.png-135.7kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注