【自动化运维专题3】ansible的Ad-hoc使用场景及举例2
此处接上节专题《【自动化运维专题2】ansible的Ad-hoc使用场景及举例》。
【自动化运维专题2】ansible的Ad-hoc使用场景及举例
moonrong,公众号:Python运维实践【自动化运维专题2】ansible的Ad-hoc使用场景及举例
2.10个
常用模块
2.6 file
模块
file
模块主要用于远程主机上的文件操作。
常用选项如下:
- force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:
yes|no
- group:定义文件/目录的属组
- mode:定义文件/目录的权限
- owner:定义文件/目录的属主
- path:必选项,定义文件/目录的路径
- recurse:递归的设置文件的属性,只对目录有效
- src:要被链接的源文件的路径,只应用于
state=link
的情况 - dest:被链接到的目标路径,只应用于
state=link
的情况 - state:有如下几个选项:
- directory:表示目录,如果目录不存在,则创建目录。
- link:创建软链接
- hard:创建硬链接
- touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
- absent:删除目录、文件或者取消链接文件。
2.6.1使用场景一
在远程主机192.168.250.50
的/mnt
目录下,如果名字为test123
的目录不存在,则创建它。
[root@ansible-control ~]# ansible 192.168.250.50 -m file -a "path=/mnt/test123 state=directory"
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/mnt/test123",
"secontext": "unconfined_u:object_r:mnt_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@ansible-control ~]#
再执行一次:
[root@ansible-control ~]# ansible 192.168.250.50 -m file -a "path=/mnt/test123 state=directory"
192.168.250.50 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/mnt/test123",
"secontext": "unconfined_u:object_r:mnt_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@ansible-control ~]#
由于/mnt/test123
目录已经存在,所以不再创建。
2.6.2使用场景二
修改远程主机192.168.250.50
的/mnt/test123
目录下文件名字为qiyou.txt
的属主、属组和权限为属主读写、属组读、其他人读权限。
[root@ansible-control ~]# ansible 192.168.250.50 -m file -a "path=/mnt/test123/qiyou.txt owner=moonrong group=moonrong mode=0644"
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 1000,
"group": "moonrong",
"mode": "0644",
"owner": "moonrong",
"path": "/mnt/test123/qiyou.txt",
"secontext": "unconfined_u:object_r:mnt_t:s0",
"size": 33,
"state": "file",
"uid": 1000
}
[root@ansible-control ~]#
2.7 copy
模块
Copy
模块用于复制文件到远程主机,copy
模块包含如下选项:
- backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:
yes|no
- content:用于替代
src
,可以直接设定指定文件的值 - dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
- directory_mode:递归的设定目录的权限,默认为系统默认权限
- force:如果目标主机包含该文件,但内容不同,如果设置为
yes
,则强制覆盖,如果为no
,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
- others:所有的file模块里的选项都可以在这里使用
- src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用
/
来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync
。
2.7.1使用场景一
将本地管理主机192.168.250.245
上的/etc/passwd
文件复制到远程主机192.168.250.50
的/mytmp
目录下。
[root@ansible-control ~]# ansible 192.168.250.50 -m copy -a 'src=/etc/passwd dest=/mytmp/passwd'
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "0c51d60d51388ad801d762498dee6432165af082",
"dest": "/mytmp/passwd",
"gid": 0,
"group": "root",
"md5sum": "d002c685535472f511b71de71aa4ae4f",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:default_t:s0",
"size": 2271,
"src": "/root/.ansible/tmp/ansible-tmp-1660363009.14-31991-131807722518625/source",
"state": "file",
"uid": 0
}
[root@ansible-control ~]#
2.7.2使用场景二
将本地管理主机192.168.250.245
上的/etc/yum
目录及其目录下整个内容全部复制到远程主机192.168.250.50
的/mytmp
目录下,同时修改属主为root
,属组为root
,目录权限为644
。
[root@ansible-control ~]# ansible 192.168.250.50 -m copy -a 'src=/etc/yum dest=/mytmp/ owner=root group=root directory_mode=644 backup=yes'
192.168.250.50 | CHANGED => {
"changed": true,
"dest": "/mytmp/",
"src": "/etc/yum"
}
[root@ansible-control ~]#
命令执行完后,可以到被管理机上查看一下:
[root@rsyncnew01 mytmp]# ll
总用量 8
……
drw-r--r--. 6 root root 100 8月 13 12:01 yum
[root@rsyncnew01 mytmp]# cd yum
[root@rsyncnew01 yum]# ll
总用量 4
drw-r--r--. 2 root root 6 8月 13 12:01 fssnap.d
drw-r--r--. 2 root root 54 8月 13 12:01 pluginconf.d
drw-r--r--. 2 root root 26 8月 13 12:01 protected.d
drw-r--r--. 2 root root 37 8月 13 12:01 vars
-rw-r--r--. 1 root root 444 8月 13 12:01 version-groups.conf
[root@rsyncnew01 yum]#
2.8 service
模块
该模块主要用于管理远程主机上的服务,该模块包含如下选项:
- enabled:是否开机启动
yes|no
- name:必选项,服务名称
- pattern:定义一个模式,如果通过
status
指令来查看服务的状态时,没有响应,就会通过ps
指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行 - sleep:如果执行了
restarted
,在stop
和start
之间沉睡几秒钟 - state:对当前服务执行启动、停止等操作
- started 启动
- stopped 停止
- restarted 重启
- reloaded 重新加载
2.8.1使用场景一
启动远程主机192.168.250.50
上的httpd
服务:
[root@ansible-control ~]# ansible 192.168.250.50 -m service -a "name=httpd state=started"
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"name": "httpd",
"state": "started",
"status": {
……
"Documentation": "man:httpd(8) man:apachectl(8)",
"EnvironmentFile": "/etc/sysconfig/httpd (ignore_errors=no)",
"ExecMainCode": "0",
"ExecMainExitTimestampMonotonic": "0",
"ExecMainPID": "0",
"ExecMainStartTimestampMonotonic": "0",
"ExecMainStatus": "0",
"ExecReload": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -k graceful ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"ExecStart": "{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -DFOREGROUND ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"ExecStop": "{ path=/bin/kill ; argv[]=/bin/kill -WINCH ${MAINPID} ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }",
"FailureAction": "none",
"FileDescriptorStoreMax": "0",
"FragmentPath": "/usr/lib/systemd/system/httpd.service",
……
}
}
[root@ansible-control ~]#
2.8.2使用场景二
设置远程主机192.168.250.50
上的httpd
服务开机自启:
[root@ansible-control ~]# ansible 192.168.250.50 -m service -a "name=httpd enabled=yes"
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"enabled": true,
"name": "httpd",
"status": {
"ActiveEnterTimestamp": "六 2022-08-13 12:31:38 CST",
……
2.9 cron
模块
它用于管理计划任务,包含如下选项:
- backup:对远程主机上的原任务计划内容修改之前做备份
- cron_file:用来指定一个计划任务文件,也就是将计划任务写到远程主机上
/etc/cron.d
目录下,创建一个文件对应的计划任务。
day:日(1-31,*,*/2,……)
hour:小时(0-23,*,*/2,……)
minute:分钟(0-59,*,*/2,……)
month:月(1-12,*,*/2,……)
weekday:周(0-7,*,……)
- job:要执行的任务,依赖于
state=present
- name:定义定时任务的描述信息
- special_time:特殊的时间范围,参数:
reboot
(重启时),annually
(每年),monthly
(每月),weekly
(每周),daily
(每天),hourly
(每小时) - state:确认该任务计划是创建还是删除,有两个值可选,分别是
present
和absent
,present
表示创建定时任务,absent
表示删除定时任务,默认为present
。 - user:以哪个用户的身份执行
job
指定的任务。
2.9.1使用场景一
在远程主机192.168.250.50
上创建1条
计划任务,每周六的1点45分
,执行yum update
更新操作:
[root@ansible-control ~]# ansible 192.168.250.50 -m cron -a 'name="yum autoupdate" weekday="6" minute=45 hour=1 user="root" job="yum -y update"'
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"yum autoupdate"
]
}
[root@ansible-control ~]#
执行成功后,现在到192.168.250.50
主机上查看计划任务列表:
[root@rsyncnew01 /]# crontab -l
#Ansible: yum autoupdate
45 1 * * 6 yum -y update
[root@rsyncnew01 /]#
2.9.2使用场景二
设置自动备份任务,每周六1点45分,执行auto_pg_bak.sh
脚本:
[root@ansible-control ~]# ansible 192.168.250.50 -m cron -a 'backup="True" name="autobackup" weekday="6" minute=45 hour=1 user="root" job="/bin/auto_pg_bak.sh"'
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/tmp/crontabXdJlCz",
"changed": true,
"envs": [],
"jobs": [
"yum autoupdate",
"autobackup"
]
}
[root@ansible-control ~]#
2.10 yum模块
它是一个常用的模块,使用yum
包管理器来管理软件包,其选项有:
- config_file:
yum
的配置文件 - disable_gpg_check:关闭
gpg_check
- disablerepo:不启用某个源
- enablerepo:启用某个源
- name:要进行操作的软件包的名字,也可以传递一个
url
或者一个本地的rpm
包的路径 - state:表示要安装还是删除软件包,要安装软件包,可选择
present
(安装)、installed
(安装)、latest
(安装最新版本),删除软件包可选择absent
、removed
。
2.10.1使用场景一
在主机192.168.250.50
上安装redis
:
[root@ansible-control ~]# ansible 192.168.250.50 -m yum -a "name=redis state=installed"
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"installed": [
"redis"
]
},
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror, langpacks\nLoading mirror speeds from cached hostfile\n * base: mirrors.aliyun.com\n * epel: mirrors.bfsu.edu.cn\n * extras: mirrors.aliyun.com\n * updates: mirrors.aliyun.com\nResolving Dependencies\n--> Running transaction check\n---> Package redis.x86_64 0:3.2.12-2.el7 will be installed\n--> Processing Dependency: libjemalloc.so.1()(64bit) for package: redis-3.2.12-2.el7.x86_64\n--> Running transaction check\n---> Package jemalloc.x86_64 0:3.6.0-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n redis x86_64 3.2.12-2.el7 epel 544 k\nInstalling for dependencies:\n jemalloc x86_64 3.6.0-1.el7 epel 105 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package (+1 Dependent package)\n\nTotal download size: 648 k\nInstalled size: 1.7 M\nDownloading packages:\n--------------------------------------------------------------------------------\nTotal 1.6 MB/s | 648 kB 00:00 \nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : jemalloc-3.6.0-1.el7.x86_64 1/2 \n Installing : redis-3.2.12-2.el7.x86_64 2/2 \n Verifying : redis-3.2.12-2.el7.x86_64 1/2 \n Verifying : jemalloc-3.6.0-1.el7.x86_64 2/2 \n\nInstalled:\n redis.x86_64 0:3.2.12-2.el7 \n\nDependency Installed:\n jemalloc.x86_64 0:3.6.0-1.el7 \n\nComplete!\n"
]
}
[root@ansible-control ~]#
2.10.2使用场景二
在主机192.168.250.50
上安装redis
最新版,并启用epel
源:
[root@ansible-control ~]# ansible 192.168.250.50 -m yum -a "name=redis state=latest enablerepo=epel"
192.168.250.50 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"changes": {
"installed": [],
"updated": []
},
"msg": "",
"rc": 0,
"results": [
"All packages providing redis are up to date",
""
]
}
[root@ansible-control ~]#
3.ansible
的其他模块
上面一共列举了10
个ansible
模块,其他模块在下面介绍:
3.1user
模块与group
模块
user
模块是请求的是useradd
, userdel
, usermod
三个指令。
group
模块请求的是groupadd
, groupdel
, groupmod
三个指令。
它们选项如下:
- name # 指定用户名
- group # 指定用户的主组
- groups # 指定附加组,如果指定为
groups=
表示删除所有组。 - shell # 指定默认
shell
- state #设置帐号状态,不指定为默认为
present
,表示创建,指定值为absent
表示删除 - remove #当使用状态为
state=absent
时使用,类似于userdel --remove
选项。
使用举例:批量给myweb
主机组添加webuser
用户:
[root@ansible-control ~]# ansible myweb -m user -a "name=webuser"
192.168.250.50 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1001,
"home": "/home/webuser",
"name": "webuser",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1001
}
192.168.250.51 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 1001,
"home": "/home/webuser",
"name": "webuser",
"shell": "/bin/bash",
"state": "present",
"system": false,
"uid": 1001
}
[root@ansible-control ~]#
3.2setup
模块
setup
模块,主要用于获取主机信息,在下一节专题里要提到的playbooks
里经常会用到的一个参数gather_facts
就与该模块相关。setup
模块下经常使用的一个参数是filter
参数来提取有用的信息。
查看主机内存信息:
[root@ansible-control ~]# ansible 192.168.250.50 -m setup -a 'filter=ansible_*_mb'
192.168.250.50 | SUCCESS => {
"ansible_facts": {
"ansible_memfree_mb": 2139,
"ansible_memory_mb": {
"nocache": {
"free": 3228,
"used": 561
},
"real": {
"free": 2139,
"total": 3789,
"used": 1650
},
"swap": {
"cached": 0,
"free": 8063,
"total": 8063,
"used": 0
}
},
"ansible_memtotal_mb": 3789,
"ansible_swapfree_mb": 8063,
"ansible_swaptotal_mb": 8063,
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
[root@ansible-control ~]#
3.3synchronize
模块
此模块通过调用rsync
进行文件或目录同步。
- archive:归档,相当于同时开启
recursive
(递归),links
,perms
,itmes
,owner
,group
,-D
选项都为yes
,默认该选项为开启 - checksum:跳过检测
sum
值,默认关闭 - compress:是不开启压缩,默认开启
- copy_links:复制链接文件,默认为
no
,注意后面还有一个links
参数 - delete:删除不存在的文件,默认为
no
- dest:目录路径
- dest_prot:默认为
22
,ssh
协议 - mode:
push
和pull
模块,push
模块的话,一般用于从本机向远程主机上传文件,pull
模式用于从远程主机上拉取文件
3.4 get_url
模块
该模块主要用于从http
、ftp
、https
服务器上下载文件(类似于wget
),主要有如下选项:
- sha256sum:下载完成后进行
sha256 check
; - timeout:下载超时时间,默认
10s
- url:下载的
URL
- url_password、url_username:主要用于需要用户名密码进行验证的情况
- use_proxy:表示使用代理,代理需事先在环境变更中定义
以上关于ansible模块介绍到这里,请关注下一节《【自动化运维专题4】ansible-playbook及使用》。
原文地址:https://mp.weixin.qq.com/s/m-xytV57nGoMD1V8WgcMEw