ansible复习笔记_基础-从零到无
--创建时间:2021年1月25日
--修改时间:2021年3月9日
--作者:飞翔的小胖猪
前言
该文档仅作为作者复习ansible使用,对格式和流程没有做过多的编排和概述。不喜勿喷。
基础
ansible控制主机是基于python中的Paramiko模板(Paramiko是python对ssh的实现) ,ansible服务端要求系统为linux操作系统,python版本在python 2.6以上。
相关网址
- ansible官方网址:ansible.com
- galaxy网站:https://galaxy.ansible.com/
执行原理
- ansible本质是通过python调用的Paramiko模块来执行命令的。
- 服务控制端的命令会由ansible在服务端生成python文件,保存在本地$HOME/.ansible/tmp中。
- 复制控制端生成的python文件到被控告主机端的$HOME/.ansible/tmp中。
- 被控主机调用python程序执行脚本。
- 被控端删除之前传过来的python文件。
注:如果在ansible命令执行过程中使用Ctrl+C或kill命令直接中断程序,也会对现行环境进行清理。就是进行第5个操作。
配置文件常用
inventory = /root/ansible/hosts #资源清单就是一些Ansible需要连接管理的主机列表 library = /usr/share/my_modules/ #库文件存放路径,Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录 forks = 5 #设置默认情况下Ansible最多能有多少个进程同时工作,默认设置最多5个进程并行处理。 sudo_user = root #默认执行命令的用户,也可以在playbook中重新设置这个参数。 remote_port = 22 #这是指定连接被关节点的管理端口,默认是22 host_key_checking = False #这是设置是否检查SSH主机的密钥。可以设置为True或False timeout = 20 #设置SSH连接的超时间隔,单位是秒。 log_path = /var/log/ansible.log #日志文件路径,Ansible系统默认是不记录日志的 private_key_file=/path/to/file.pem #在使用ssh公钥私钥登录系统时候,使用的密钥路径。 module_name = command #ansible默认模块,建议修改为shell ask_sudo_pass = True #每次执行ansible是否询问ssh密码 remote_tmp = ~/.ansible/tmp #远程被控端文件存放路径 local_tmp = ~/.ansible/tmp #服务端生成文件存放路径
关键路径
- inventory:主机配置清单文件路径。
- library:库文件存放目录
- remote_tmp:远程被控端文件存放路径
- local_tmp:服务端生成文件存放路径
- log_path:日志路径
备注
- 主机添加信息时一定要使用分组,通过分组把资源按各种特性按类分派。
- 在主机列表中添加连续的主机可以使用如192.168.100.[1-100]表示192.168.1.1-192.168.1.100这100个ip地址。
- ansible控制端取消首次登录输入yes的操作在配置文件设置host_key_checking = False
- ansible种返回结果默认颜色标识。 黄色:成功-修改动作。 绿色:成功-查询动作。
- 颜色可以根据自己的习惯修改,在/etc/ansible/ansible.cfg文件中[colors]里面定义。
- playbook同等于脚本,role是一堆playbook的集合用来实现特定的功能。
- yaml文件有敏感信息时必须进行加密,加密过后必须进行解密操作后才能操作。
- command模块时ansible的默认模块很多通配符都无法支持,一般情况下不适用command模块。command模块不支持管道符和变量等,如果要使用这些,需要shell模块。
- shell模块实现的功能比command多,支持很多如管道符等特殊符号。shell也不完全能够完美适用于所有shell命令。
- 专用的操作请使用ansible专用的模块。
- ansible执行命令时确定不用对端设备的信息收集时请关闭连接时的信息收集的选项。gather_facts:no
- 通过playbook执行了相关 操作过后,使用ansbile-hoc命令检查测试是否达成预期目的。
- 开启了ansible日志记录时,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现的日志中的
配置文件
ansible一般有两种安装方式使用得比较多得是直接使用操作命令进行安装,也可通过python模块得方式安装。
如果通过操作系统软件包管理工具,那么在/etc/ansible 目录下应该已经有了ansible.cfg 配置文件。
以python模块方式安装的情况需要设置配置文件。
ansible配置文件在/etc/ansible/ansible.cfg
Ansible 配置文件是以ini 格式存储配置数据的,在Ansible 中,几乎所有的配置项都可以通过 Ansible 的 playbook 或环境变量来重新赋值。在运行Ansible 命令时,命令将会按照预先设定的顺序查找配置文件,如下所示:
- ANSIBLE_CONFIG :首先,Ansible 命令会检查环境变量,及这个环境变量将指向的配置文件。
- ./ansible.cfg:其次,将会检查当前目录下的ansible.cfg 配置文件。
- ~ /.ansible.cfg:再次,将会检查当前用户home 目录下的.ansible.cfg 配置文件。
- /etc/ansible/ansible.cfg :最后,将会检查在用软件包管理工具安装Ansible 时自动产生的配置文件。
- 大多数的Ansible 参数可以通过设置带有ANSIBLE_ 开头的环境变量进行配置,参数名称必须都是大写字母,如下配置项:
- export ANSIBLE_SUDO_USER=root
- 设置了环境变量之后,ANSIBLE_SUDO_USER 就可以在playbook 中直接引用。
常用命令
hoc
ansible all -m 模块名 -a ' 模块参数 ' -f 5 :hoc执行命令,all代表所有主机
ansible-doc ::查看帮助文件
ansible-doc -l :查看有多少个模块
ansible-doc 模块名:查看具体模块使用方法(详细)
ansible-doc -s 模块名 :查看具体模块的使用方法(简单),推荐使用这个命令来查看帮助文档。
ansible-galaxy:查找获取互联网中别人定义的role。可在https://galaxy.ansible.com/网站查看搜索相关的role。
ansible-galaxy install role名 : 安装指定的模块
ansible-galaxy remove role名 : 卸载指定的模块系统中存在的
ansible-galaxy list :查看系统中存在的role
ansible-vault encrypt xxxx.yml :加密xml文件
ansible-vault decrypt xxxx.yml : 解密xml文件
ansible-vault view xxxx.yml : 查看加密的xml文件
ansible-vault edit xxxxx.yml : 修改
ansible-vault rekey xxxxx.yml : 修改指定文件的口令
playbook
ansible-playbook -C XXXX.yaml 运行前检测,不实际运行。-C是大写
ansible-playbook --list-hosts XXXX.yaml 查看playbook脚本中包含的主机列表
ansible-playbook --list--tags XXXX.yaml 查看标签
ansible-playbook --list-tasks XXXX.yaml 查看playbook脚本中task列表
ansible-playbook --limit XXXX.yaml 限制文本中部分主机执行脚本
ansible-playbook -v -vv -vvv XXXX.yaml 查看脚本执行过程中的信息
ansible-playbook -t 标签名 XXXX.yaml 只指定执行yaml文件中带有特定tag的task
模块
command模块
作用:远程调用执行命令,此为默认模块,可忽略-m选项
常用参数:chdir(切换路径) creates(创建文件,如果存在则不创建) removes(删除文件,如果不存在则删除失败)
#远程切换到/etc目录下,查看/etc/redhat-release文件,设置并发数为5。 ansible all -m command -a 'chdir=/etc removes=/root/111111 creates=/root/22222 cat redhat-release' -f 5 #删除/root/111111文件,并创建/root/22222文件,设置并发数为5。 ansible all -m command -a 'removes=/root/111111 creates=/root/22222 ' -f 5
shell模块
作用:远程调用执行命令,支持管道符等特殊字符。
常用参数:chdir(切换路径) creates(创建文件,如果存在则不创建) removes(删除文件,如果不存在则删除失败)
#远程切换到/etc目录下,查看/etc/redhat-release文件,设置并发数为5。 ansible all -m shell -a 'chdir=/etc removes=/root/111111 creates=/root/22222 cat redhat-release' -f 5 #删除/root/111111文件,并创建/root/22222文件,设置并发数为5。 ansible all -m shell -a 'removes=/root/111111 creates=/root/22222 ' -f 5 #shell命令可以使用管道等特殊字符 ansible all -m shell -a 'cat /proc/cpuinfo|wc -l'
script模块
作用:服务端脚本拷贝至远端执行。
#远程执行test.sh脚本。 ansible all -m script -a 'test.sh' -f 5
copy模块
作用:拷贝服务端文件至被控端服务器。
参数:src(源路径) dest(目的路径) mode(权限) owner(用户)
注:copy模块可以实现文件夹的远程复制。例src=/dir1/dir2/ 表示dir2文件夹下所有文件, src=/dir1/dir2 表示dir2文件夹本身。
#如目标存在,默认覆盖,此处指定先备份 ansible all -m copy -a “src=/root/1111 dest=/tmp/2222 owner=lvan mode=655 backup=yes” #指定内容,直接生成目标文件 ansible all -m copy -a "content='test line1\ntest line2' dest=/tmp/test.txt" #复制/etc/下的文件,不包括/etc/目录自身,加不加斜杠很重要 ansible all -m copy -a “src=/etc/ dest=/backup”
fetch模块
作用:抓取原路径下的文件到对端指定目录中,不能抓取目录。抓取的结果会在dest路径中以src的目录结构创建子目录保存。
参数:src(源路径) dest(目的路径)
注:如src=/dir1/dir2/file1 dest=/test/ 结果是:/test/dir1/dir2/file1
#从远端主机抓取/etc/redhat-release文件至服务端的/data/os目录下 [root@ansible ~]#ansible all -m fetch -a 'src=/etc/redhat-release dest=/data/os' [root@ansible ~]#tree /data/os/ /data/os/ ├── 10.0.0.6 │ └── etc │ └── redhat-release ├── 10.0.0.7 │ └── etc │ └── redhat-release └── 10.0.0.8 └── etc └── redhat-release 6 directories, 3 files
unarchive模块
作用:解压操作
参数:copy(是否进行待解压包拷贝) src(源路径) dest(目的路径) owner(用户) mode(设置解压缩后的文件权限)
注:解压模块默认的流程是先把压缩包从服务端拷贝到被控端后再执行解压。如果压缩包本来就在本地则不需要进行复制操作,使用copy=no参数。
#拷贝/data/lvan.tgz文件到远端服务器中,并解压到/tmp/data/目录下 ansible all -m unarchive -a 'src=/data/lvan.tgz dest=/tmp/data' #解压远端服务器本地的/tmp/lvan.zip文件到/tmp/data目录下,设置解压过后的权限为0777 ansible all -m unarchive -a 'src=/tmp/lvan.zip dest=/tmp/data copy=no mode=0777' #设置远端服务器从链接中获取到文件并解压到/tmp/data文件夹中 ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/tmp/data copy=no'
archive模块
作用:打包软件。
参数:path(要压缩的文件或目录) dest(压缩后的文件) format(指定打包的类型:bz2, gz, tar, xz, zip) owner(设置用户) mode(权限)
#打包/var/log/路径下的所有文件至/data/log.tar.gz2文件,格式为bz2,所属用户和lvan,权限为0600 ansible websrvs -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=lvan mode=0600'
file模块
作用:设置文件属性
#创建空文件 ansible all -m file -a 'path=/data/test.txt state=touch' #删除文件 ansible all -m file -a 'path=/data/test.txt state=absent' #设置文件的所有者和权限 ansible all -m file -a "path=/root/test.sh owner=l mode=755" #创建目录 ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql" #创建软链接 ansible all -m file -a ‘src=/data/testfile dest=/data/testfile-link state=link’
hostname模块
作用:修改主机名
参数:name(主机名称)
#设置test1主机的主机名为test11 ansible test1 -m hostname -a “name=test11”
cron模块
作用:添加修改查看计划任务。
参数:minute(分钟) hour(小时) day(天) month(月) weekday(周) disabled(暂停)
注:计划任务存放在/var/spool/cron/用户名 目录下
#备份数据库脚本 [root@centos8 ~]#cat test.sh echo "`date` " >> /var/log/message #创建任务 ansible all -m cron -a 'hour=2 minute=30 weekday=1-5 name="test11" job=/root/test.sh' ansible all -m cron -a "minute=*/5 job='/root/test.sh &>/dev/null' name=checktime" #禁用计划任务 ansible all -m cron -a "minute=*/5 job='/root/test.sh &>/dev/null' name=checktime disabled=yes" #启用计划任务 ansible all -m cron -a "minute=*/5 job='/root/test.sh &>/dev/null' name=checktime disabled=no" #删除任务 ansible all -m cron -a "name='checktime' state=absent" ansible all 'state=absent name=test11'
yum模块
作用:redhat系列操作系统包管理模块
参数:name(软件名) state(状态 ,absent卸载、present安装)
#安装httpd软件 ansible websrvs -m yum -a ‘name=httpd state=present’ #卸载httpd软件 ansible websrvs -m yum -a ‘name=httpd state=absent’
功能:管理服务
参数:name(服务名) state(状态:started启动、stopped停止、restarted重启) enalbed(开机启动:yes/no)
#启动httpd服务,并设置开机启动 ansible all -m service -a 'name=httpd state=started enabled=yes' #停止httpd服务 ansible all -m service -a 'name=httpd state=stopped' #重读httpd配置文件 ansible all -m service -a 'name=httpd state=reloaded’
user模块
作用:用户管理模块
#创建用户,设置uid为2048,家目录为/home/user2,属于root组 ansible all -m user -a 'name=test22 uid=2048 home=/home/user2 group=root' #创建用户,设置uid为88,属于root组和daemon组,shell为nologin,不创建家目录,id号设置可以不唯一。 ansible all -m user -a 'name=test33 uid=88 group=root groups="root,daemon" shell=/sbin/nologin system=yes create_home=no home=/data/nginx non_unique=yes' #删除用户及家目录等数据 ansible all -m user -a 'name=test22 state=absent remove=yes'
group模块
作用:用户管理模块
#创建组 ansible all -m group -a 'name=testgroup gid=99 system=yes' #删除组 ansible all -m group -a 'name=testgroup state=absent'
lineinfile模块
作用:修改文件中特定的行,同等于操作系统中的sed命令。有点类似于sed中先使用d然后再追加操作。
参数:path(文件路径) regexp(正则表达式) line(修改成的结果) state=absent(删除特定的行)
#替换远程主机/etc/selinux/config文件以SELINUX=开头的行为SELINUX=enforcing ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=enforcing'" #删除远程主机中/etc/fstab文件中开头是#的行 ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
replace模块
作用:修改该制定文件中的内容,同等于操作系统中的sed命令。
#为远程主机/etc/fstab文件中开头是UUID的行加上#号,后面的\1代表括号中匹配到的数据。 ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'" #为远程主机/etc/fstab文件中开头是#号的行去除掉#号,只保留正则括号中匹配到的数据用\1寄存代替。 ansible all -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
setup模块
作用:收集主机信息
参数:filter(筛选制定的参数)
注:该模块在ansible执行命令时会自动运行,如果确定不需要被控端主机的信息,一定要在配置文件或playbook脚本中关闭收集主机信息操作。会节约很多资源的并明显能够提升命令运行速度。
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*"