Ad-hoc 命令是什么呢? 这其实是⼀个概念性的名字,是相对于写Ansible playbook 来说的.类似于在命令⾏敲⼊shell命令和 写shell scripts两者之间的关系。可以⽤于执⾏⼀些临时命令。
如果我们敲⼊⼀些命令去⽐较快的完成⼀些事情,⽽不需要将这些执⾏的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。
Ansible提供两种⽅式去完成任务,⼀是 ad-hoc 命令,⼀是写Ansible playbook。
前者可以解决⼀些简单的任务, 后者解决较复杂的任务,⽐如做配置管理或部署。
在快速⼊⻔中执⾏的 Ansible 命令,类似于批量执⾏命令。在Ansible 中统称为Ansible Ad-Hoc。
命令格式如下:
ansible pattern [-i inventory] -m module -a argument
pattern 资产选择器:
ansible all -i 192.168.244.188,192.168.244.198 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"
意思是将192.168.244.188服务器主机中的/tmp/a.conf复制到192.168.244.198中,并且路径也是/tmp。
Ansible 模块分三种类型: 核⼼模块(core module)、附加模块(extra module)及⽤户⾃定义模块(consume module)。
核⼼模块是由Ansible 的官⽅团队提供的。
附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。
当核⼼模块和附加模块都⽆法满⾜你的需求时,⽤户可以⾃定义模块。
默认情况下,在安装Ansible 的时候, 核⼼模块和附加模块都已经安装⽽⽆需⽤户⼲预。
Ansible 的核⼼模块和附加模块,数量有3000+ 。这样庞⼤的模块数量,对于任何⼀个接触Ansible 的⼈都不可能将其完全记住、掌握使⽤。 因此能够顺利使⽤Ansible 的帮助⽂档,对我们来说是很有必要的。Ansible 的帮助⽂档,由它本身提供的命令 ansible-doc 实现。
a.列举出所有核心模块和附加模块
ansible-doc -l
ansible-doc <modulename>
ansible-doc -s <modulename>
为了便于演示和操作,现在把之前的测试主机 IP 192.168.244.188和192.168.244.198保存到 当前⽬录下的 hosts ⽂件中。
两个模块都是在远程服务器上去执⾏命令。
但command模块是ad-hoc的默认模块,在执⾏ad-hoc时,若不指定模块的名字则默认使⽤此模块。
ansible all -i hosts -a "echo 'hello'"
ansible all -i hosts -m shell -a "echo 'hello'"
例子:
ansible all -i hosts -m shell -a "echo 'hello'|grep -o 'e'"
ansible all -i hosts -a "echo 'hello'|grep -o 'e'"
将管理节点上的脚本传递到被管理节点(远程服务器)上进⾏执⾏。
例子:
cat /root/a.sh
ansible webservers -i hosts -m script -a "/root/a.sh"
ansible webservers -i hosts -m shell -a "ls -l /tmp/testfile"
copy 模块的主要⽤于管理节点和被管理节点之间的⽂件拷⻉。
常用参数:
例子:
cat /text/text.txt
copy管理节点上的/text/text.txt到被管理节点上:
ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt"
ansible webservers -i hosts -m shell -a "ls -l /text/text.txt"
ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt backup=yes"
copy文件的同时对文件进行用户和用户组设置:
ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt owner=nobody group=nobody"
copy文件的同时对文件进行权限设置:
ansible webservers -i hosts -m copy -a "src=/text/text.txt dest=/text/text.txt mode=0755"
添加YUM仓库
常用参数:
例子–
添加epel源-
ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/ $releasever/$basearch/' description='EPEL YUM repo'"
ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进⾏管理。
**常⽤参数: **
例子–
安装一个软件包
ansible webservers -i hosts -m yum -a "name=nginx state=present"
ansible webservers -i hosts -m yum -a "name=nginx state=latest"
ansible webservers -i hosts -m yum -a "name=nginx state=installed"
卸载一个软件包
ansible webservers -i hosts -m yum -a "name=nginx state=absent"
ansible webservers -i hosts -m yum -a "name=nginx state=removed"
安装一个软件包组
ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。
常⽤参数:
例子–
重新加载systemd-
ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
启动nginx服务-
ansible webservers -i hosts -m systemd -a "name=nginx state=started"
关闭nginx服务-
ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
重启nginx服务-
ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
重新加载 Nginx 服务-
ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
将 Nginx 服务设置开机⾃启动-
ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
在被管理节点上,对组进⾏管理。
_常⽤参数: _
例子–
ansible dbservers -i hosts -m group -a "name=db_admin"
⽤于在被管理节点上对⽤户进⾏管理。
**常⽤参数: **
例子–
创建用户并设置密码-
先生成加密密码:
pass=$(echo "123456" | openssl passwd -1 -stdin)
执行ansible命令,创建用户foo并设置密码:
ansible all -i hosts -m user -a "name=foo password=${pass}"
创建⽤户 yangge, 并且为其创建密钥对,并且密钥类型为: ecdsa:
ansible all -i hosts -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"
创建⽤ tom, 并且设置其有效期到 2020年4⽉15⽇, 加⼊到组db_admin 中, 不改变⽤户原有假如的组:
ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20200415) gorups=db_admin append=yes"
date 命令说明–
计算 3 ⼩时之后是⼏点⼏分-
date +%T -d '3 hours'
任意⽇期的前 N 天,后 N 天的具体⽇期-
date +%F -d "20190910 1 day"
date +%F -d "20190910 -1 day"
计算两个⽇期相差天数, ⽐如计算⽣⽇距离现在还有多少天-
d1=$(date +%s -d 20180728)
d2=$(date +%s -d 20180726)
echo $(((d1-d2)/86400))
fifile 模块主要⽤于远程主机上的⽂件操作。
常⽤参数:
例子–
创建一个文件-
ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
改变文件所有者及权限-
ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
创建一个软链接-
ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
创建一个目录-
ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
取消一个链接-
ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent"
删除一个文件-
ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
管理远程节点的CRON 服务。等同于Linux 中的 计划任务。
**PS:**使⽤ Ansible 创建的计划任务,是不能使⽤本地crontab -e去编辑,否则 Ansible ⽆法再次操作此计划任务了。
常⽤参数:
例子–
新建一个CRON JOB任务-
ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
删除⼀个 CRON JOB 任务,删除时,⼀定要正确指定job 的name参数,以免误删除-
ansible all -i hosts -m cron -a "name='create new job' state=absent"
登录任何⼀台管理机验证cron-
crontab -l
Ansible: create new job
debug 模块主要⽤于调试时使⽤,通常的作⽤是将⼀个变量的值给打印出来。
常⽤参数–
例子–
这⾥引⼊了变量,我们只需了解 debug 模板的使⽤即可。在学习变量、剧本时,我们会对它有更深刻的理解
ansible all -i hosts -m debug -a "var=role" -e "role=web"
ansible all -i hosts -m debug -a "msg='role is {{role}} '" -e "role=web"
template 模块使⽤了Jinjia2格式作为⽂件模版,可以进⾏⽂档内
变量的替换。⽂件以 .j2 结尾。
常⽤参数–
例子–
_ _ ⽤法其实和 copy 模块基本⼀样, template 模块的强⼤之处就是使⽤变量替换,就是可以把传递给 Ansible 的变量的值替换到模板⽂件中。
建立一个template文件,名为hello_world.j2
cat hello_world.j2
ansible all -i hosts -m template -a "src=hello_world.j2 dest=/text/hello_world.world" -e "var=world"
在被控主机上验证
cat /text/hello_world.world
在被管理节点上,⽤正则匹配的⽅式对⽬标⽂件的⼀⾏内容修改删除等操作。
如果是在⼀个⽂件中把所有匹配到的多⾏都进⾏统⼀处理,请参考replace 模块。
如果想对⼀个⽂件进⾏⼀次性添加/更新/删除多⾏内容等操作,参考blockinfifile模块
常⽤参数–
例子–
删除被控节点⽂件⾥的某⼀条内容-
ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
替换某⼀⾏-
ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
对⽬标⽂件进⾏多⾏的添加/更新/删除操作
常⽤参数–
例子–
**_ _**向⽂件/etc/ssh/sshd_config的最后添加⼏⾏内容添加的内容是
Match User ansible-agent
PasswordAuthentication no
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication no'"
更新之前的内容-
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'"
删除⽂件中的连续出现⼏⾏内容-
ansible dbservers -i hosts -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes' state=absent