ansible常用模块使用熟练!!!
快速上手Ansible以及常见模块应用
Playbook介绍
Ansible playbook剧本介绍
-
在ansible中,类似”脚本”的文件被称作”剧本”,英文名称为’playbook’ ,用于配置,部署,和管理被控节点
-
我们只需要把模块按照顺序编排在playbook剧本中,ansible就会按照剧本一步一步的执行,最终达到我们的目的
-
playbook是由一个或多个”play”组成的列表,当我们在工作中往往需要不止做一件事情的时候,使用playbook会更加适合。
-
playbook 与ad-hoc相比是一种完全不同的运用方式,剧本需要遵循YAML语法格式编写,文件名以”.yaml”或者”.yml”作为文件名后缀
playbook核心元素
-
hosts:用于指定要执行指定任务(task)的主机,须事先定义在主机清单中
-
tasks:任务集,由模板定义的操作列表
-
variables:内置变量或自定义变量在playbook中调用
-
tempaltes 模板,可替换文件中的变量并实现一些简单逻辑的文件
-
handlers:任务,与tasks不同的是只有在接受到通知(notify)时才会被触发
查看帮助
-
命令:ansible-doc
-
常用选项:
-l #列出所有模块列表
-s #查看模块帮助信息
ansible执行
-
Ansible命令返回值的颜色表示:
-
绿色:代表对远程节点不进行相应修改,没有发生改变,命令执行成功
-
黄色:代表对远程节点进行了相应的修改,命令执行成功
-
红色:代表你的命令执行失败或者是有异常
-
紫色:代表命令执行后发出的警告信息,给我们一些建议(可以忽略)
-
Ansible执行命令的方式
-
ad-hoc:在命令行执行的命令(临时命令)
-
Playbook:将命令写入到Playbook剧本中
-
playbook结果语法检测及模拟执行
-
语法检测,--syntax-check 用于检测playbook语法是否正确,如果正确只返回playbook名称
-
模拟执行,--check 用于模拟执行playbook
定义Ansible主机清单
-
定义主机清单
[[192.168.77.130[192.168.77.145 ansible_connection=ssh chapass=rb123456192.168.77.146[192.168.77.128192.168.77.140[prod[192.168.77.[10:15]192.168.77.[30:40:3][ansible_become=trueansible_ssh_user=ruanboansible_ssh_pass=123456ansible_become_method=suansible_become_user=rootansible_become_pass=redhat[password="123456"
-
列出主机清单列表
ansible -i hosts all --list-host
或者
ansible-inventory -i hosts all --graph
-
使用ping模块测试主机连通性
[root@ansible-server ~]# ansible -i hosts all -m ping
Playbook剧本包含内容说明
#使用ping模块测试远程主机联通性,并在远程主机创建目录[root@ansible-server ~]# vim ping_test.yml---- hosts: testremote_user: roottasks:- name: ping testping:- name: mkdir directory testshell:cmd: mkdir /test#第一行:playbook剧本以---开头表明yaml格式文件#第二行:使用”- “作为开头,”- “表示一个列表项,”- “后面使用hosts关键字指定要操作的主机组名,(注意:横杠后面有空格)表示我要在websrvs这组主机上进行操作,在YAML语法中,键值对需要使用冒号作为分隔,而且冒号后边必须还要有一个空格作为分隔#第三行:remote_user关键字可以指定在进行远程操作时使用哪个用户进行操作#第四行:tasks关键字是用来指定要执行哪些操作任务,之后的行都属于tasks任务列表中的任务,每个任务都以”- “开头,每个任务都有自己的名字,任务名使用name关键字进行指定
Ansible常用模块介绍
command 模块
-
command模块为默认模块,用于远程执行命令(命令模块)
-
注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行的命令中含比如”<“, “>”, “|”, “;” 和 “&” 这些符号时,这些符号的功能也会失效
-
常用参数:
-
chdir:此参数表示执行命令之前,会先进入到指定的目录中
-
creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行
-
removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行
-
command模块示例:
#chdir参数表示执行命令之前,会先进入到指定的目录中[root@ansible-server ~]# ansible test -m command -a 'chdir=/root/ ls'#creates参数表示如果/etc/passwd文件存在于远程主机中,则不执行对应命令,如果不存在,才执行”touch”命令[root@ansible-server ~]# ansible test -m command -a 'creates=/etc/passwd touch /opt/passwd'#removes参数表示如果/opt/abc文件不存在,就不执行“mv”命令,如果文件存在则执行“mv”命令[root@ansible-server ~]# ansible test -m command -a 'removes=/opt/abc mv /opt/abc /root/'
shell 模块
-
shell 模块,远程执行命令模块,和command模块类似,区别在于shell模块通过/bin/bash程序处理命令
-
常用参数
-
chdir:此参数表示执行命令之前,会先进入到指定的目录中
-
creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行
-
removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行
-
shell 模块示例:
#查看/etc/passwd文件,并通过管道符传递给“wc -l”统计文件行数[root@ansible-server ~]# ansible websrvs -m shell -a 'cat /etc/passwd | wc -l'#通过chdir参数进入/opt/目录,执行“ls”[root@ansible-server ~]# ansible websrvs -m shell -a 'chdir=/opt/ ls'#查看主机名[root@ansible-server ~]# ansible websrvs -m shell -a 'hostname'
script 模块
-
script 模块用于远程执行脚本,脚本存放在ansible主机本地,不需要拷贝到远程主机
-
常用参数:
-
chdir:此参数表示执行命令之前,会先进入到指定的目录中
-
creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行命令
-
removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行命令
-
script模块示例:
#在ansible主机本地编写搭建yum仓库脚本[root@ansible-server ~]# vim local_centos7.sh#!/bin/bashecho "[local_centos7]name=local_centos7baseurl=http://192.168.77.130/centos7.9/enabled=1gpgcheck=0" > /etc/yum.repos.d/local_centos7.repo#编写playbook文件[root@ansible-server ansible]# vim playbook/script.yml---- name: configure local-yumhosts: testtasks:- name: Run a script with arguments (free form)script: /home/ruanbo/ansible/local_centos7.sh#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/script.yml
yum 模块
-
yum 模块,用于在远程主机通过yum源管理软件包
-
常用参数:
-
present:此状态为默认值,表示安装软件包
-
installed:此状态表示安装软件包,与present等效
-
latest:此状态表示安装yum中最新版本软件包
-
removed:此状态表示删除对应软件包
-
absent:此状态表示删除对应软件包,与removed等效
-
name:必须参数,用于指定需要管理的软件包名字
-
state:用于指定软件包的状态
yum模块示例:
#利用ansible实现批量安装软件包[root@ansible-server ~]# vim /home/ruanbo/ansible/playbook/yum-install.yml---- name: install packageshosts: testtasks:- name: ensure a list of packages installedyum:name: "{{ packages }}"state: installedvars:packages:- httpd- httpd-tools#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/yum-install.yml
service 模块
-
service 模块,用于管理远程主机的服务,如:启动或停止服务
-
常用参数:
-
name:此参数用于指定需要操作的服务名称,如 httpd
-
state:此参数用于指定服务的状态
started:此状态用于启动服务restarted:此状态用于重启服务stopped:此状态用于停止服务 -
enabled:此参数用于指定是否将服务设置为开机启动项,设置为yes或者no
#利用ansible实现批量启动web服务并设置开机自启动[root@ansible-server ansible]# vim playbook/service.yml---- name: manager serviceshosts: testtasks:- name: Start service httpd, if not startedservice:name: httpdstate: startedenabled: yes#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/service.yml
copy 模块
-
copy 模块,用于将文件复制到远程主机
-
常用参数:
-
src:此参数用于指定需要拷贝的文件或目录
-
content:此参数当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一
-
dest:此参数用于指定文件将拷贝到远程主机的哪个目录中,dest为必须参数
-
owner:指定文件拷贝到远程主机后的属主
-
group:指定文件拷贝到远程主机后的属组
-
mode:指定文件拷贝到远程主机后的权限
-
force:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖
-
backup:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份
#利用ansible实现批量下发文件到客户端主机[root@ansible-server ansible]# vim playbook/copy.yml---- name: copy applicationhosts: testtasks:- name: Copy file with owner and permissionscopy:src: /home/ruanbo/ansible/playbook/service.ymldest: /tmp/foo.confowner: foogroup: foomode: '0644'backup: yes#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/copy.yml
fetch 模块
-
fetch模块,从远程主机获取文件到ansible管理节点
-
常用参数:
-
src:指定从受管主机中拉取哪个文件
-
dest:指定拉取文件到本地以后文件存放的位置
#利用ansible实现批量拉取客户端主机文件到ansible管理节点[root@ansible-server ansible]# cat playbook/fetch.yml---- name: fetch filehosts: testtasks:- name: Specifying a path directlyfetch:src: /tmp/testdest: /tmp/test-{{ inventory_hostname }}#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/fetch.yml
user 模块
-
user 模块,用于管理用户,如用户的创建及删除
-
常用参数:
-
name:需要用于被操作的对象用户名称
-
password:用户密码,需要通过hash加密
-
remove:是否删除一个用户
#利用ansible实现批量创建用户并设置密码[root@ansible-server ansible]# cat playbook/useradd.yml---- name: add userhosts: testtasks:- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'user:name: johndpassword: "{{'123456' | password_hash('sha512')}}"#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/useradd.yml
lineinfile 模块
-
lineinfile 模块,常用于对文件的行替换、插入、删除
-
常用参数:
-
path:指定要操作的文件对象
-
line:要写入文件的内容
-
regexp:匹配条件
-
insertbefore:在某行之前插入
-
insertafter:在某行之后插入
-
backup: 执行配置任务前是否先进行备份,yes|no
#利用ansible实现批量修改配置文件,包括管理selinux,配置hosts解析,修改web服务端口[root@ansible-server ansible]# vim playbook/chage_config.yml---- name: change confighosts: testtasks:- name: Ensure SELinux is set to enforcing modelineinfile:path: /etc/selinux/configregexp: '^SELINUX='line: SELINUX=enforcing- name: Replace a localhost entry with our ownlineinfile:path: /etc/hostsregexp: '^127\.0\.0\.1'line: 127.0.0.1 localhostowner: rootgroup: rootmode: '0644'- name: Ensure the default Apache port is 8080lineinfile:path: /etc/httpd/conf/httpd.confregexp: '^Listen 'insertafter: '^#Listen 'line: Listen 8080notify: restart httpdhandlers:- name: restart httpdservice:name: httpdstate: restarted#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/chage_config.yml
yum_repository模块
-
yum_repository模块:管理yum仓库
-
常用参数:
-
name:指定唯一的仓库ID
-
baseurl:指定yum仓库repodata目录的URL,可以是多个,如果设置为多个,需要使用"metalink"和"mirrorlist"参数
-
enabled:使用此yum仓库
-
gpgcheck:是否对软件包执行gpg签名检查
-
gpgkey:gpg秘钥的URL
-
mode:权限设置
-
state:状态,默认的present为安装此yum仓库,absent为删除此yum仓库
-
description:设置仓库的注释信息
#利用ansible实现批量配置yum源[root@ansible-server ansible]# vim playbook/yum_repository.yml---- name: add yum repodatahosts: testtasks:- name: Add repositoryyum_repository:name: yumlocaldescription: EPEL YUM repobaseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/gpgcheck: noenabled: yes#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/yum_repository.yml
file模块
-
file模块,创建或者和删除远程主机上的文件或者目录
-
常用参数:
-
path:用于指定要操作的文件或目录
-
mode:设置文件属性
-
owner:所有者
-
group:所属组
-
recurse:当文件为目录时,是否进行递归设置权限
-
state:
touch :创建文件directory:创建目录absent:删除文件或者目录或者链接文件link或hard:创建链接文件
#利用ansible实现批量创建文件[root@ansible-server ansible]# vim playbook/file.yml---- name: mkdir dirhosts: testtasks:- name: Create a directory if it does not existfile:path: /tmp/test/test/state: directorymode: '0750'recurse: yesowner: ruanbogroup: ruanbo#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/file.yml
cron模块
-
cron模块,用于管理远程主机中的计划任务
-
常用参数:
-
name:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示
-
job:此参数用于指定计划的任务中需要实际执行的命令或者脚本
-
user:此参数用于设置当前计划任务属于哪个用
-
state参数:当计划任务有名称时,可以根据名称修改或删除对应的任务
-
minute:此参数用于设置计划任务中分钟设定位的值,默认值为”*”
-
hour:此参数用于设置计划任务中小时设定位的值,默认值为”*”
-
day:此参数用于设置计划任务中日设定位的值,默认值为”*”
-
month:此参数用于设置计划任务中月设定位的值,默认值为”*”
-
weekday:此参数用于设置计划任务中周几设定位的值,默认值为”*”
#利用ansible实现批量为指定用户创建定时任务[root@ansible-server ansible]# cat playbook/cron.yml---- name: configure cronhosts: testtasks:- name: datecron:name: "check dirs"minute: "*/1"job: "date >> /tmp/datetime"user: ruanbo#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/cron.yml
多任务应用场景举例
利用Playbook源码部署Nginx的Web服务
[root@ansible-server ~]# vim nginx.yml---- hosts: websrvsremote_user: roottasks:- name: Copy nginxcopy: src=/root/nginx-1.18.0.tar.gz dest=/tmp- name: install Relyyum: name=gcc,pcre-devel,openssl-devel,zlib- name: unpacek nginxshell: tar -xf /tmp/nginx-1.18.0.tar.gz -C /tmp- name: install nginxshell: cd /tmp/nginx-1.18.0 && ./configure && make && make install- name: Copy index.htmlcopy: src=/root/index.html dest=/usr/local/nginx/html- name: start nginxshell: /usr/local/nginx/sbin/nginx
利用Playbook安装http应用并启动服务
[root@ansible-server ansible]# vim playbook/httpd.yml---- name: install httpd and start httpdhosts: testtasks:- name: install httpdyum:name: "{{ packages }}"state: installedvars:packages:- httpd- httpd-tools- name: Start service httpd, if not startedservice:name: httpdstate: startedenabled: yes#执行playbook[root@ansible-server ansible]# ansible-playbook playbook/httpd.yml