文章目录
- 六. ansible常用模块
- commad----远程执行
- shell
- script----运行脚本
- copy
- fetch----从远程提取
- file-----文件属性等
- unarchive----压缩文件使用
- 其他
- Archive:打包压缩
- Hostname:管理主机名
- Cron:计划任务
- yum:管理包--- 对于redhat而言
- Service:管理服务
- User:管理用户
- Group:管理组
- Lineinfile ---修改文件内容
- Replace ---相当于sed修改文件内容
- Setup ---手机主机信息
- debug输出信息
- register 返回值
- prompt---交互输入
- 例如debug+register
- 七. ansible系列命令
- ansible-galaxy
- ansible-pull
- ansible-playbook
- ansible-vault 加密
- Ansible-console 交互执行
六. ansible常用模块
commad----远程执行
Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’
此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
用chdir切换文件夹,之后执行命令
creates判断存在—存在不执行
shell
Shell:和command相似,用shell执行命令
支持| ,变量等
ansible -m shell -a ‘echo magedu |passwd –stdin wang’
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &> /tmp/example.txt 这些复杂命令,
即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
将shell模块改为默认模块module_name=shell方便与支持特殊符号启动远程selinux,sed有专用模块
script----运行脚本
Script:在远程主机上运行ansible服务器上的脚本
逻辑——将ansible服务器的脚本拷贝到远程主机,执行,并且删除
-a "/PATH/TO/SCRIPT_FILE“
ansible websrvs -m script -a /data/f1.sh
写一个脚本hello.sh,加上执行权限,然后远程执行
ansible all -m script -a “/root/hello.sh”
copy
Copy:从主控端复制文件到远程主机
参数:
src源,
dest目的
owner属主
group属组
mode改权限
backup 是否备份
content= 生成文件内容 自定义文件,并拷贝
这里的srv是一组ansible控制的机器
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----从远程提取
fetch:从远程主机提取文件至主控端,copy相反,目前不支持目录
src是远程的文件
dest本机文件夹
最后会生成不同的文件—以ip区分
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
file-----文件属性等
file:设置文件属性
state指定硬链接hard—或软连接link,
state=touch创建空文件
state=absent删除文件(要想删除一个目录中所有的文件—删除目录即可)
state=directory 创建文件夹
path 需要管理的文件
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----压缩文件使用
unarchive:解包解压缩,有两种用法:
1、将ansible主机上的压缩包在本地解压缩后传到远程主机上,设置copy=yes.
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
常见参数:
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
示例:
ansible srv -m unarchive -a ‘src=foo.tgz dest=/var/lib/foo’
ansible srv -m unarchive -a ‘src=/tmp/foo.zip dest=/data copy=no mode=0777’
ansible srv -m unarchive -a ‘src=https://example.com/example.zip dest=/data copy=no’’
用途
**可以自动化实现多台机的 二进制安装
其他
Archive:打包压缩
ansible all -m archive -a ‘path=/etc/sysconfig
dest=/data/sysconfig.tar.bz2 format=bz2 owner=wang mode=0777’
Hostname:管理主机名
ansible node1 -m hostname -a “name=websrv”
Cron:计划任务
支持时间:minute,hour,day,month,weekday
创建计划任务–每5分钟同步一下时间
ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate
172.16.0.1 &>/dev/null’ name=Synctime” 创建任务
禁用计划任务 —最后加上 disabled=true
删除计划任务 —最后加上 state=absent
ansible srv -m cron -a ‘state=absent name=Synctime’ 删除任务
yum:管理包— 对于redhat而言
ansible srv -m yum -a ‘name=httpd state=present’ 安装
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’
- name: Start zookeeper service
service:
name: zookeeper
enabled: yes
state: started
将httpd的监听端口改为8080
User:管理用户
创建用户,加注释,指定uid,家目录等
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
system=yes创建系统账户—create_home=no 不创建家目录
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
remove=yes将用户及家目录删除
state=absent只删除用户
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 —修改文件内容
ansible在使用sed
进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,
存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可
以方便的进行替换
功能:相当于sed,可以修改文件内容
ansible websrvs -m lineinfile -a "path=/etc/httpd/conf/httpd.conf
regexp='^Listen' line='Listen 80'"
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX='
line='SELINUX=disabled'"
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
Replace —相当于sed修改文件内容
该模块有点类似于sed命令
,主要也是基于正则进行匹配和替换
,建议使用
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
ansible all -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
Setup —手机主机信息
功能: setup 模块来收集主机的系统信息
,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用 gather_facts
: no 来禁止 Ansible 收集 facts 信息
ansible all -m setup
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup -a "filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_processor*"
[root@ansible ~]#ansible all -m setup -a 'filter=ansible_python_version'
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "2.7.5",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
10.0.0.6 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "2.6.6",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "3.6.8",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
#取所有IP
ansible 10.0.0.101 -m setup -a 'filter=ansible_all_ipv4_addresses'
10.0.0.101 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.0.1",
"192.168.0.2",
"192.168.64.238",
"192.168.13.36",
"10.0.0.101",
"172.16.1.0",
"172.17.0.1"
]
},
"changed": false
}
#取默认IP
ansible all -m setup -a 'filter="ansible_default_ipv4"'
10.0.0.101 | SUCCESS => {
"ansible_facts": {
"ansible_default_ipv4": {
"address": "10.0.0.101",
"alias": "eth0",
"broadcast": "10.0.0.255",
"gateway": "10.0.0.2",
"interface": "eth0",
"macaddress": "00:0c:29:e8:c7:9b",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "10.0.0.0",
"type": "ether"
}
},
"changed": false
}
debug输出信息
吧信息输出到ansible的控制台上,用于定位问题
通常与register连用
还可以输出变量
register 返回值
ansible执行之后都有一些返回值
,只是不显示
register将返回值放到指定的变量中
prompt—交互输入
提示用户输入信息,将用户输入的信息存在指定的变量中,如果需要用时,只需要引用变量就可以
输入不显示
例如:输入,回显
也可以设置输入时的默认值
例如debug+register
七. ansible系列命令
tasks:
- name: Check Idle port for zookeeper
shell: ss -ntl | grep -e {{ listen_port }} -e {{ port2 }}
ignore_errors: True
register: zoo
- name: WARN for port check
debug:
msg: "WARNING Port {{ listen_port }} or {{ port2 }} is not idle, Service zookeeper will not be deploy"
when: zoo is succeeded
- name: Copy download zookeeper pkgs in all hosts
copy: src={{package_path}}/zookeeper/zookeeper.rpm dest=/tmp/
when: zoo is failed
- name: yum install zookeeper rpm
shell: 'yum localinstall /tmp/zookeeper.rpm -y'
when: zoo is failed
ansible-galaxy
连接 https://galaxy.ansible.com 下载相应的roles
列出所有已安装的galaxy
ansible-galaxy list
安装galaxy
ansible-galaxy install geerlingguy.redis
删除galaxy
ansible-galaxy remove geerlingguy.redis
ansible-pull
推送命令至远程,效率无限提升,对运维要求较高
ansible-playbook
执行playbook
示例:ansible-playbook hello.yml
cat hello.yml
#hello world yml file
- hosts: websrvs #针对那些主机设置
remote_user: root #以谁的身份
tasks:
- name: hello world
command: /usr/bin/wall hello world
ansible-vault 加密
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
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 创建新文件
Ansible-console 交互执行
可交互执行命令,支持tab
root@test (2)[f:10] $
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
设置并发数: forks n 例如: forks 10
切换组: cd 主机组 例如: cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
在所有主机上执行(3台),可以使5个进程并发执行