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=rb123456
192.168.77.146
[
192.168.77.128
192.168.77.140
[
prod
[
192.168.77.[10:15]
192.168.77.[30:40:3]
[
ansible_become=true
ansible_ssh_user=ruanbo
ansible_ssh_pass=123456
ansible_become_method=su
ansible_become_user=root
ansible_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: test
remote_user: root
tasks:
- name: ping test
ping:
- name: mkdir directory test
shell:
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/bash
echo "[local_centos7]
name=local_centos7
baseurl=http://192.168.77.130/centos7.9/
enabled=1
gpgcheck=0" > /etc/yum.repos.d/local_centos7.repo
#编写playbook文件
[root@ansible-server ansible]# vim playbook/script.yml
---
- name: configure local-yum
hosts: test
tasks:
- 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 packages
hosts: test
tasks:
- name: ensure a list of packages installed
yum:
name: "{{ packages }}"
state: installed
vars:
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 services
hosts: test
tasks:
- name: Start service httpd, if not started
service:
name: httpd
state: started
enabled: 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 application
hosts: test
tasks:
- name: Copy file with owner and permissions
copy:
src: /home/ruanbo/ansible/playbook/service.yml
dest: /tmp/foo.conf
owner: foo
group: foo
mode: '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 file
hosts: test
tasks:
- name: Specifying a path directly
fetch:
src: /tmp/test
dest: /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 user
hosts: test
tasks:
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
user:
name: johnd
password: "{{'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 config
hosts: test
tasks:
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=enforcing
- name: Replace a localhost entry with our own
lineinfile:
path: /etc/hosts
regexp: '^127\.0\.0\.1'
line: 127.0.0.1 localhost
owner: root
group: root
mode: '0644'
- name: Ensure the default Apache port is 8080
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: Listen 8080
notify: restart httpd
handlers:
- name: restart httpd
service:
name: httpd
state: 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 repodata
hosts: test
tasks:
- name: Add repository
yum_repository:
name: yumlocal
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
gpgcheck: no
enabled: 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 dir
hosts: test
tasks:
- name: Create a directory if it does not exist
file:
path: /tmp/test/test/
state: directory
mode: '0750'
recurse: yes
owner: ruanbo
group: 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 cron
hosts: test
tasks:
- name: date
cron:
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: websrvs
remote_user: root
tasks:
- name: Copy nginx
copy: src=/root/nginx-1.18.0.tar.gz dest=/tmp
- name: install Rely
yum: name=gcc,pcre-devel,openssl-devel,zlib
- name: unpacek nginx
shell: tar -xf /tmp/nginx-1.18.0.tar.gz -C /tmp
- name: install nginx
shell: cd /tmp/nginx-1.18.0 && ./configure && make && make install
- name: Copy index.html
copy: src=/root/index.html dest=/usr/local/nginx/html
- name: start nginx
shell: /usr/local/nginx/sbin/nginx
利用Playbook安装http应用并启动服务
[root@ansible-server ansible]# vim playbook/httpd.yml
---
- name: install httpd and start httpd
hosts: test
tasks:
- name: install httpd
yum:
name: "{{ packages }}"
state: installed
vars:
packages:
- httpd
- httpd-tools
- name: Start service httpd, if not started
service:
name: httpd
state: started
enabled: yes
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/httpd.yml