automation
2023-07-26 17:08:22 0 举报
AI智能生成
linux
作者其他创作
大纲/内容
day01
配置ansible管理环境
使用一套ansible软件,有可能需要管理多种环境。如在同一台管理主机上管理开发环境和生产环境。<br> 通过创建不同的工作目录,来实现相应的管理需求。<br> 将某一环境下的主机写入到对应工作目录的主机清单文件。<br> 进入对应的工作目录执行管理任务,就可以管理相应环境的主机。
ansible ad-hoc语法格式是什么样:<br><br>Ansible adhoc语法是一种命令行工具,用于快速执行一些简单的任务。<br>它的语法格式为:ansible [options] pattern [-m module_name] [-a args]。<br>其中,pattern指定要执行任务的主机或主机组,module_name指定要使用的模块,args指定模块的参数。<br>例如,要在所有主机上安装nginx,可以使用以下命令:ansible all -m yum -a "name=nginx state=present"。<br>这将在所有主机上执行yum模块,安装nginx软件包
[...~]# mkdir ansible # 创建ansible工作目录,目录名自己定义,不是固定的。<br>[....~]# cd ansible # 创建配置文件,默认的配置文件是/etc/ansible/ansible.cfg,<br> 但是一般不使用它,而是在工作目录下创建自己的配置文件<br>[...ansible]# vim ansible.cfg # 文件名必须是ansible.cfg<br>[defaults]<br>host_key_checking = false # 不检查主机密钥,=号两边空格可有可无。<br>inventory = inventory # 定义主机清单文件为当前目录的inventory<br><br>[...ansible]# vim inventory # 创建主机清单文件。写在[]里的是组名,[]下面的是组内的主机名<br>[webservers]<br>web[1:2] # web1和web2的简化写法,表示从1到2<br>[dbs]<br>db1<br>[cluster:children] # cluster是组名,自定义的;:children是固定写法,表示下面的组名是cluster的子组。<br>webservers<br>dbs<br><br>[...ansible]# ansible all --list-hosts # 查看被管理的所有的主机。注意,一定在工作目录下执行命令。<br> hosts (3):<br> web1<br> web2<br> db1<br>[...ansible]# ansible webservers --list-hosts # 查看webservers组中所有的主机<br> hosts (2):<br> web1<br> web2
ansible管理
ansible进行远程管理的两个方法:<br> adhoc临时命令。就是在命令行上执行管理命令。<br> playbook剧本。把管理任务用特定格式写到文件中。<br> 无论哪种方式,都是通过模块加参数进行管理。
adhoc临时命令
语法:<br>ansible 主机或组列表 -m 模块 -a "参数" # -a是可选的
通过ping模块测试到远程主机的连通性。<br>[root@pubserver ansible]# ansible all -m ping<br># 该命令检查是否可以管理远程主机。如果结果为绿色的SUCCESS,则表示成功。<br># 如果是红色的UNREACHABLE,则检查网络是否可通,是否已经可以免密登陆
ansible模块
在ansible中,通过模块来完成某一特定任务。<br> 学习模块,主要知道实现某种功能,需要哪个模块。<br> 模块的使用方式都一样。主要是查看该模块有哪些参数。
# 列出全部可用模块,按空格键向下翻页,按q退出<br>[root@pubserver ansible]# ansible-doc -l<br><br># 列出模块数量<br>[root@pubserver ansible]# ansible-doc -l | wc -l # 如有WARNING提示,可忽略<br>7214<br><br># 查看包含yum的模块名<br>[root@pubserver ansible]# ansible-doc -l | grep yum<br><br># 查看yum模块的帮助文档,按空格键向下翻页,按q退出<br>[roo@pubserver ansible]# ansible-doc yum
<font color="#e74f4c">ping模块</font> # 测试到远程主机的连通性。<br>...ansible]# ansible all -m ping<br><font color="#e74f4c">command模块</font><br> ansible默认模块,用于在远程主机上执行任意命令<br> command不支持shell特性,如管道、重定向。<br><font color="#e74f4c">shell模块</font><br> 与command模块类似,但是支持shell特性,如管道、重定向。<br> ...ansible]# ansible web1 -m shell -a "ip a s | head" # 查看web1的ip地址,只显示前10行<br><font color="#e74f4c">script模块</font>: 用于在远程主机上执行脚本 <br>[...ansible]# vim test.sh # 在控制端创建脚本即可<br>#!/bin/bash<br>for i in user{1..5}<br>do<br> useradd $i<br> echo '123456' | passwd --stdin $i<br>done<br>....ansible]# ansible webservers -m script -a "test.sh" # 在webservers组的主机上执行脚本
<font color="#e74f4c">file模块:</font><br>可以创建文件、目录、链接等,还可以修改权限、属性等<br> 常用的选项:<br> path:指定文件路径<br> owner:设置文件所有者<br> group:设置文件所属组<br> state:状态。<br> touch表示创建文件,directory表示创建目录<br> link表示创建软链接,absent表示删除<br> mode:设置权限<br> src:source的简写,源<br> dest:destination的简写,目标<br>ansible-doc file #查看使用帮助<br>... ...<br>EXAMPLES:<br>- name: Change file ownership, group and permissions # 忽略<br> ansible.builtin.file: # 模块名。以下是它的各种参数<br> path: /etc/foo.conf # 要修改的文件的路径<br> owner: foo # 文件所有者<br> group: foo # 文件的所有组<br> mode: '0644' # 权限<br>... ...<br># 根据上面的example,-m file -a的内容就是doc中把各参数的冒号换成=号
ansible webservers -m file -a "path=/tmp/file.txt state=touch" <br> # touch是指如果文件不存在,则创建;如果存在则改变它的时间戳<br>ansible webservers -m file -a "path=/tmp/demo state=directory"<br> # 在webservers组的主机上创建/tmp/demo目录<br>ansible webservers -m file -a "path=/tmp/file.txt owner=sshd group=adm mode='0777'"<br> # 将webservers组的主机上/tmp/file.txt的属主改为sshd,属组改为adm,权限改为0777<br>ansible webservers -a "ls -l /tmp/file.txt"<br>ansible webservers -m file -a "path=/tmp/file.txt state=absent"<br> # 删除webservers组的主机上/tmp/file.txt<br>ansible webservers -m file -a "path=/tmp/demo state=absent"<br> # 删除webservers组的主机上/tmp/demo<br>ansible webservers -m file -a "src=/etc/hosts dest=/tmp/hosts.txt state=link"<br> # 在webservers组的主机上创建/etc/hosts的软链接,目标是/tmp/hosts.txt
<font color="#e74f4c">copy模块:</font><br>用于将文件从控制端拷贝到被控端<br> src:源。控制端的文件路径<br> dest:目标。被控制端的文件路径<br> content:内容。需要写到文件中的内容<br> 可以上传目录<br><br><font color="#e74f4c">fetch模块:</font><br>与copy模块相反,copy是上传,fetch是下载<br> src:源。被控制端的文件路径<br> dest:目标。控制端的文件路径<br><b> <font color="#a23c73">不能下载目录</font></b><br>
ansible webservers -m copy -a "src=a3.txt dest=/root/"<br>ansible webservers -m copy -a "content='Hello World' dest=/tmp/mytest.txt"<br> # 在目标主机上创建/tmp/mytest.txt,内容是Hello World<br><br>ansible webservers -m fetch -a "src=/etc/hostname dest=~/"<br> # 将webservers主机上的/etc/hostname下载到本地用户的家目录下
操作文件内容:<br><font color="#e74f4c">lineinfile模块:</font><br>用于确保存目标文件中有某一行内容<br> path:待修改的文件路径<br> line:写入文件的一行内容<br> regexp:正则表达式,用于查找文件中的内容<br><br><font color="#e74f4c">replace模块:</font><br>replace可以替换关键词<br> path:待修改的文件路径<br> replace:将正则表达式查到的内容,替换成replace的内容<br> regexp:正则表达式,用于查找文件中的内容<br>
ansible webservers -m lineinfile -a "path=/etc/issue line='Hello World'"<br> # webservers组中的主机,/etc/issue中一定要有一行Hello World。<br> 如果该行不存在,则默认添加到文件结尾<br>ansible webservers -m lineinfile -a "path=/etc/issue line='chi le ma' regexp='Hello'"<br> # webservers组中的主机,把/etc/issue中有Hello的行,替换成chi le ma<br><br>ansible webservers -m replace -a "path=/etc/issue regexp='chi' replace='he'"<br> # 把webservers组中主机上/etc/issue文件中的chi,替换成he
综合操作:<br> 所有操作均对webservers组中的主机生效<br> 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777<br> 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600<br> 替换目标主机/tmp/mydemo/hosts文件中的db1为database1<br> 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录
# 在目标主机上创建/tmp/mydemo目录,属主和属组都是adm,权限为0777<br>ansible webservers -m file -a "path=/tmp/mydemo owner=adm group=adm mode='0777' state=directory" <br><br> # 将控制端的/etc/hosts文件上传到目标主机的/tmp/mydemo目录中,属主和属组都是adm,权限为0600<br>ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/mydemo owner=adm group=adm mode='0600'"<br><br> # 替换目标主机/tmp/mydemo/hosts文件中的db1为database1<br>ansible webservers -m replace -a "path=/tmp/mydemo/hosts regexp='db1' replace='database1'"<br><br> # 将目标主机/tmp/mydemo/hosts文件下载到控制端的当前目录。<br>ansible webservers -m fetch -a "src=/tmp/mydemo/hosts dest=."
<font color="#e74f4c">user模块:</font><br>实现linux用户管理<br> name:待创建的用户名<br> uid:用户ID<br> group:设置主组<br> groups:设置附加组<br> home:设置家目录<br> password:设置用户密码<br> state:状态。present表示创建,它是默认选项。absent表示删除<br> remove:删除家目录、邮箱等。值为yes或true都可以。
ansible webservers -m user -a "name=zhangsan"<br>ansible webservers -m user -a "name=lisi uid=1010 group=adm groups=daemon,root home=/home/lisi"<br> # 在webservers组中的主机上,创建lisi用户。设置其uid为1010,主组是adm,<br> 附加组是daemon和root,家目录是/home/lisi。<br><br>ansible webservers -m user -a "name=zhangsan password={{'123456'|password_hash('sha512')}}"<br> # 设置zhangsan的密码是123456<br> # {{}}是固定格式,表示执行命令。password_hash是函数,sha512是加密算法,<br> 则password_hash函数将会把123456通过sha512加密变成zhangsan的密码。<br><br>ansible webservers -m user -a "name=zhangsan state=absent"<br> # 删除zhangsan用户,不删除家目录<br><br>ansible webservers -m user -a "name=lisi state=absent remove=yes"<br> # 删除lisi用户,同时删除家目录
<font color="#e74f4c">group模块</font><br> 创建、删除组<br> name:待创建的组名<br> gid:组的ID号<br> state:present表示创建,它是默认选项。absent表示删除<br>
ansible webservers -m group -a "name=devops"<br> # 在webservers组中的主机上创建名为devops的组<br>ansible webservers -m group -a "name=devops state=absent"<br> # 在webservers组中的主机上删除名为devops的组
day02
常用模块
<font color="#e74f4c">yum_repository</font><br> 用于配置yum<br> file: 指定文件名
# 在webservers组中的主机上,配置yum<br>ansible webservers -m yum_repository -a "file=myrepo name=myApp description='My App' <br> baseurl=ftp://192.168.88.240/dvd/AppStream gpgcheck=no enabled=yes"<br>[...web1 ~]# cat /etc/yum.repos.d/myrepo.repo <br>[myApp]<br>async = 1<br>baseurl = ftp://192.168.88.240/dvd/AppStream<br>enabled = 1<br>gpgcheck = 0<br>name = My App<br>ansible webservers -m yum_repository -a "file=myrepo name=BaseOS description='Base OS' <br> baseurl=ftp://192.168.88.240/dvd/BaseOS gpgcheck=no enabled=yes"<br>[...web1 ~]# cat /etc/yum.repos.d/myrepo.repo <br>[myApp]<br>................<br>[BaseOS]<br>................<br>
<font color="#e74f4c">yum模块</font><br> 用于rpm软件包管理,如安装、升级、卸载<br> name:包名<br> state:状态。默认是安装,可以不写安装!<br> present表示安装,如果已安装则忽略;<br> latest表示安装或升级到最新版本;<br> absent表示卸载。
ansible webservers -m yum -a "name=tar state=present"<br>ansible webservers -m yum -a "name=wget,net-tools"<br>ansible webservers -m yum -a "name=wget state=absent"<br>ansible webservers -m yum -a "name=nginx state=latest"<br>
<font color="#e74f4c">service模块</font><br> 用于控制服务。启动、关闭、重启、开机自启。<br> name:控制的服务名<br> state:started表示启动;<br> stopped表示关闭;<br> restarted表示重启<br> enabled:yes表示设置开机自启;<br> no表示设置开机不要自启。
ansible webservers -m service -a "name=nginx state=started enabled=yes"
<font color="#569230">逻辑卷相关模块</font><br>动态管理存储空间<br>对逻辑卷进行扩容或缩减<br>PV---VG---LV<br>LV可以像普通分区一样,进行格式化、挂载
<font color="#e74f4c">lvg模块</font><br> 创建、删除卷组,修改卷组大小<br> vg:定义卷组名---volume group<br> pvs:由哪些物理卷构成---physical volumes
ansible web1 -m yum -a "name=lvm2"<br><br>...web1 ~]# fdisk /dev/vdb # 手工在web1上对vdb进行分区<br>Command (m for help): g # 创建GPT分区表<br>Command (m for help): n # 新建分区<br>Partition number (1-128, default 1): # 回车,使用1号分区<br>First sector (2048-41943006, default 2048): # 起始位置,回车<br>Last sector, +sectors or +size{K,M,G,T,P} (2048-41943006, default 41943006): +5G <br> # 结束位置+5G<br>...........<br><br>lsblk # vdb被分出来了两个分区<br>ansible web1 -m lvg -a "vg=myvg pvs=/dev/vdb1"<br> # 在web1上创建名为myvg的卷组,该卷组由/dev/vdb1组成<br>ansible web1 -m lvg -a "vg=myvg pvs=/dev/vdb1,/dev/vdb2"<br> # 扩容卷组。卷组由PV构成,只要向卷组中加入新的PV,即可实现扩容<br>vgs # 在web1上查看卷组<br>
<font color="#e74f4c">lvol模块</font><br> 创建、删除逻辑卷,修改逻辑卷大小<br> vg:指定在哪个卷组上创建逻辑卷<br> lv:创建的逻辑卷名。logical volume<br> size:逻辑卷的大小,不写单位,以M为单位<br>
ansible web1 -m lvol -a "vg=myvg lv=mylv size=2G"<br> # 在web1上创建名为mylv的逻辑卷,大小为2GB<br>ansible web1 -m lvol -a "vg=myvg lv=mylv size=4G"<br> # mylv扩容至4GB<br>lvs # 在web1上查看逻辑卷<br>ansible web1 -m lvol -a "vg=myvg lv=mylv size=6G <font color="#a23c73">resizefs=true"<br> #格式化后再扩容,需要再格式化!<br></font>
<font color="#e74f4c">filesystem模块</font><br> 用于格式化,也就是创建文件系统<br> fstype:指定文件系统类型<br> dev:指定要格式化的设备,可以是分区,可以是逻辑卷
ansible web1 -m filesystem -a "fstype=xfs dev=/dev/myvg/mylv"<br> # 在web1上,把/dev/myvg/mylv格式化为xfs <br>blkid /dev/myvg/mylv # 在web1上查看格式化结果
<font color="#e74f4c">mount模块</font><br> 用于挂载文件系统<br> path:挂载点。如果挂载点不存在,自动创建。<br> src:待挂载的设备<br> fstype:文件系统类型<br> state:mounted,表示永久挂载<br> present 临时挂载<br>
ansible web1 -m mount -a "path=/data src=/dev/myvg/mylv state=mounted fstype=xfs"<br> # 在web1上,把/dev/myvg/mylv永久挂载到/data,回自动在/etc/fstab生成一行<br>ansible web1 -m mount -a "path=/data state=absent"<br> #卸载/dev/myvg/mylv<br>ansible web1 -m lvol -a "lv=mylv state=absent vg=myvg <font color="#a23c73">force=yes</font>"<br> #强制删除/dev/myvg/mylv<br>ansible web1 -m lvg -a "vg=myvg state=absent"<br> #删除myvg卷组
Playbook
常用于复杂任务的管理,以及管理经常要完成的任务<br>playbook也是通过模块和它的参数,在特定主机上执行任务<br>playbook是一个文件,该文件中需要通过yaml格式进行书写
Playbook的作用:<br> Ansible的核心组件之一,它是一种用于定义、组织和执行Ansible任务的语言。<br>可包含多个任务,每个任务可以指定要执行的模块、主机、变量和条件等信息。<br>使用Playbook可以实现自动化部署、配置管理、应用程序发布等任务。<br>Playbook通常使用YAML格式编写,易于阅读和维护。
<font color="#e74f4c">yaml语法规范</font>-----YAML Ain't a Markup Language<br> 1.yaml文件的文件名,一般以yml或yaml作为扩展名<br> 2.文件一般以---作为第一行,不是必须的,但是常用<br> 3.<font color="#a23c73">键值对</font>使用冒号:表示,冒号后面必须有空格。<br> name=zhangsan ------ <font color="#a23c73">name: zhangsan</font><br> 4.数组使用-表示,-后面必须有空格。<br> 5.相同的层级必须有相同的缩进。如果缩进不对,则有语法错误。<br> 每一级缩进,建议2个空格。<br> 6.全文<u><font color="#569230">不能使用tab</font></u>,必须使用空格。<br> vim ~/.vimrc<br> <font color="#569230"> set ai # 设置自动缩进<br> set ts=2 # 设置按tab键,缩进2个空格<br> set et # 将tab转换成相应个数的空格</font>
编写playbook:<br> 一个剧本(即playbook),可以包含多个play<br> 每个play用于在指定的主机上,通过模块和参数执行相应的任务<br> 每个play可以包含多个任务。<br> 任务有模块和参数构成。
vim test.yml<br>---<br>- name: test network # play的名字,可选项<br> hosts: all # 作用于所有的主机<br> tasks: # 任务<br> - name: test via ping # 第1个任务的名字,可选项<br> ping: # 第1个任务使用的模块<br><br>ansible-playbook test.yml # 执行playbook<br>
在dbs组的主机和web1上创建/tmp/demo目录,权限是0755。<br>将控制端/etc/hosts拷贝到目标主机的/tmp/demo中。<br><br>vim fileop.yml<br>---<br>- name: create dir and copy file<br> hosts: dbs,web1 # 这里的名称,必须出现在主机清单文件中<br> tasks:<br> - name: create dir<br> file:<br> path: /tmp/demo<br> state: directory<br> mode: '0755'<br> - name: copy file<br> copy:<br> src: /etc/hosts<br> dest: /tmp/demo/hosts<br><br>ansible-playbook fileop.yml
在webservers组中的主机上,创建用户bob,附加组是adm;<br>在db1主机上,创建/tmp/hi.txt,其内容为Hello World.<br>---<br>- name: create user<br> hosts: webservers<br> tasks:<br> - name: create bob <br> user:<br> name: bob <br> groups: adm <br>- name: create file<br> hosts: db1 <br> tasks:<br> - name: make file<br> copy:<br> dest: /tmp/hi.txt<br> content: 'hello world\n'
|和>的区别:<br>|它保留换行符,>把多行合并为一行
vim f1.yml<br>---<br>- name: play 1<br> hosts: webservers<br> tasks:<br> - name: mkfile 1.txt<br> copy:<br> dest: /tmp/1.txt<br> content: <font color="#a23c73">| 或者 ></font><br> Hello World!<br> ni hao.
cat /tmp/1.txt 写 | 结果,换行<br>Hello World!<br>ni hao.<br>cat /tmp/2.txt 写 > 结果,不换行<br>Hello World! ni hao.
<u>在webservers组中的主机上创建john用户,它的uid是1040,主组是daemon,密码为123</u><br>vim user_john.yml<br>---<br>- name: create user<br> hosts: webservers<br> tasks:<br> - name: create user john<br> user:<br> name: john<br> uid: 1040<br> group: daemon<br> password: "{{'123'|password_hash('sha512')}}" {{}}开头,必须加引号;字符类型的必须加引号<br>
<u>在webservers组中的主机上删除用户john</u><br> vim del_john.yml<br>---<br>- name: delete user<br> hosts: webservers<br> tasks:<br> - name: delete user john<br> user:<br> name: john<br> state: absent
硬盘管理<br> 常用的分区表类型有:MBR(主引导记录)、GPT(GUID分区表)<br> MBR最多支持4个主分区,或3个主分区加1个扩展分区。最大支持2.2TB左右的硬盘<br> GPT最多支持128个主分区。支持大硬盘
parted模块<br> 用于硬盘分区管理<br> device:待分区的设备<br> number:分区编号<br> state:present表示创建,absent表示删除<br> part_start:分区的起始位置,不写表示从开头<br> part_end:表示分区的结束位置,不写表示到结尾
子主题
vim disk.yml<br>---<br>- name: disk manage #创建分区<br> hosts: web1<br> tasks:<br> - name: create a partition<br> parted:<br> device: /dev/vdc<br> number: 1 #分区1<br> state: present<br> part_end: 1GiB #单位必须写GiB <br><br> - name: add a new partition<br> parted:<br> device: /dev/vdc<br> number: 2 #分区2<br> state: present<br> part_start: 1GiB #开始位置<br> part_end: 6GiB #结束位置<br><br> - name: create my_vg #创建名为my_vg的卷组<br> lvg:<br> vg: my_vg<br> pvs: /dev/vdc1,/dev/vdc2<br> - name: create my_lv #创建名为my_lv的逻辑卷<br> lvol:<br> vg: my_vg<br> lv: my_lv<br> size: 1G #单位可以写G<br> <br> - name: mkfs my_lv #格式化<br> filesystem:<br> dev: /dev/my_vg/my_lv<br> fstype: ext4<br> - name: mount my_lv<br> mount: #挂载,没有目录/data,自动创建<br> path: /data<br> src: /dev/my_vg/my_lv<br> fstype: ext4<br> state: mounted #永久挂载,并写入/etc/fstab<br>
day03
ansible <br>模块进阶及变量<br>
---<br>- name: install pkgs<br> hosts: webservers<br> tasks:<br> - name: install web pkgs <br> yum:<br> <font color="#a23c73">name: 还可以写为--- name:httpd,php,php-mysqlnd<br> - httpd 还可以写为--- name:[httpd,php,php-mysqlnd]<br> - php<br> - php-mysqlnd</font><br> state: present<br><br> - name: install dev group<br> yum:<br> <font color="#a23c73">name: "@Development Tools" # </font>安装软件包组,<font color="#a23c73">@</font>表示后面的名字是组名<br> state: present yum grouplist # 列出所有的软件包组,yum groupinstall "Development Tools"<br> 如果列出的组名为中文,可以这样进行:LANG=C yum grouplist<br><br> - name: update system # 相当于yum update命令<br> yum:<br> name: "*" # 表示系统已经安装的所有包<br> state: latest #升级<br>
facts变量:<br>ansible自带的预定义变量,<br>用于描述被控端软硬件信息<br>facts变量通过<font color="#e74f4c">setup模块</font>获得
ansible webservers -m setup # 通过setup模块查看所有facts变量
facts变量是一个大的由{}构成的键值对字典。在{}中,有很多层级的嵌套。可以通过参数过滤出第一个层级的内容。<br>ansible webservers -m setup -a "filter=ansible_all_ipv4_addresses" # 查看所有的IPV4地址,filter是过滤的意思<br>ansible webservers -m setup -a "filter=ansible_memfree_mb" # 查看可用内存
常用的facts变量<br> ansible_all_ipv4_addresses:所有的IPV4地址<br> ansible_bios_version:BIOS版本信息<br> ansible_memtotal_mb:总内存大小<br> ansible_hostname:主机名
# 显示远程主机的主机名和内存大小。在ansible中,变量使用{{}}表示<br># <font color="#e74f4c">debug模块</font>用于输出信息,常用的参数是msg,用于输出指定内容<br><br>vim debug.yml<br>---<br>- name: display host info<br> hosts: webservers<br> tasks:<br> - name: display hostname and memory<br><font color="#e74f4c"> debug: # debug是模块,它的选项msg可以输出指定信息</font><br> <font color="#e74f4c">msg</font>: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}} MB"
自定义变量:<br> 引入变量,可以方便Playbook重用。<br> 比如装包的playbook,包名使用变量。<br> 多次执行playbook,只要改变变量名,不用编写新的playbook。<br>常用变量:<br> inventory变量。变量来自于主机清单文件<br> playbook变量。变量在playbook中定义。<br> 变量文件。专门创建用于保存变量的文件。推荐变量写入单独的文件。
1.使用inventory变量:<br>vim inventory<br><br>[webservers]<br>web1<br>web2<br><br>[dbs]<br>db1 <font color="#a23c73">username="wangwu"</font> # 定义主机变量的方法<br><br><font color="#a23c73">[webservers:vars] </font> # 定义组变量的方法,:vars是固定格式<br><font color="#a23c73">username="zhaoliu"<br><br></font>2.通过变量创建用户:<br>vim var1.yml<br>---<br>- name: webservers create user<br> hosts: dbs,webservers <br> tasks:<br> - name: create user<br> user:<br> name: "{{username}}"<br> state: present
3.在playbook中定义变量:<br>vim user_jack.yml<br>---<br>- name: create user<br> hosts: webservers<br> vars: # 固定格式,用于声明变量<br> username: "jack" # 此处引号可有可无<br> mima: "123456" # 此处引号是需要的,表示数字字符<br> tasks:<br> - name: create some users<br> user:<br> name: "{{username}}" # {}出现在开头,必须有引号<br> state: present<br> password: "{{mima|password_hash('sha512')}}"
4.将变量定义在文件中:<br>vim vars.yml # 文件名自定义<br>---<br>yonghu: rose<br>mima: abcd<br><br>vim user_rose.yml <br>---<br>- name: create user<br> hosts: webservers<br><font color="#a23c73"><b> vars_files: vars.yml # vars_files用于声明变量文件</b></font><br> tasks:<br> - name: create some users<br> user:<br> name: "{{yonghu}}" # 这里的变量来自于vars.yml<br> state: present<br> password: "{{mima|password_hash('sha512')}}"
<font color="#e74f4c">firewalld 模块<br></font>用于配置防火墙的模块<br> port:声明端口<br> permanent:永久生效,但不会立即生效<br> immediate:立即生效,临时生效<br> state:enabled,放行;disabled拒绝
vim firewall.yml<br>---<br>- name: configure webservers<br> hosts: webservers<br> tasks:<br> - name: install nginx pkg # 这里通过yum模块装包<br> yum:<br> name: nginx<br> state: present<br> - name: start nginx service # 这里通过service模块启服务<br> service:<br> name: nginx<br> state: started<br> enabled: yes<br> - name: install firewalld pkg # 这里通过yum模块安装firewalld<br> yum:<br> name: firewalld<br> state: present<br> - name: start firewalld service # 这里通过service模块启service服务<br> service:<br> name: firewalld<br> state: started<br> enabled: yes<br> - name: set firewalld rules # 通过firewalld模块开放80端口<br> firewalld:<br> port: 80/tcp<br> permanent: yes<br> immediate: yes<br> state: enabled<br>
<font color="#e74f4c">template 模块 <br></font> copy模块可以上传文件,但是文件内容固定<br> template模块可以上传具有特定格式的文件(如文件中包含变量)<br> 当远程主机接收到文件之后,文件中的变量将会变成具体的值 <br> template模块上传的文件,使用的语法叫Jinja2。<br> src:要上传的文件<br> dest:目标文件路径
vim index.html<br><br>Welcome to {{ansible_hostname}} on {{ansible_eth0.ipv4.address}}
vim templ.yml<br>---<br>- name: upload index<br> hosts: webservers<br> tasks:<br> - name: create web index<br> <font color="#e74f4c"> template:</font><br> src: index.html<br> dest: /usr/share/nginx/html/index.html
进阶<br>
一、错误处理:ignore_errors: yes<br>1.写在某个任务里:<br>指定某一个任务如果出现错误,则忽略它<br>继续执行后续任务<br>2.全局设置写在play,无论哪个任务出现问题,都要忽略
1.vim myerr.yml<br>---<br>- name: my errors<br> hosts: webservers<br> tasks:<br> - name: start mysqld service<br> service:<br> name: mysqld<br> state: started<br> enabled: yes<br><font color="#a23c73"> ignore_errors: yes # 即使这个任务失败了,也要继续执行下去</font><br><br> - name: touch a file<br> file:<br> path: /tmp/service.txt<br> state: touch<br><br>2.- name: my errors<br> hosts: webservers<br> <font color="#a23c73"> ignore_errors: yes #全局设置,忽略</font><br> tasks:<br> - name: start mysqld service<br> ... ...<br> - name: touch a file<br> ... ...<br>
二、触发执行任务:<br> 通过handlers定义触发执行的任务<br> handlers中定义的任务,不是一定会执行的<br> 在tasks中定义的任务,通过notify关键通知handlers中的哪个任务要执行<br> 只有tasks中的任务状态是changed才会进行通知。
vim get_conf.yml # 下载web1上的/etc/nginx/nginx.conf <br>---<br>- name: download nginx.conf<br> hosts: web1<br> tasks:<br> - name: get nginx.conf<br> fetch:<br> src: /etc/nginx/nginx.conf<br> dest: ./<br><font color="#a23c73"> flat: yes # 直接下载文件,不要目录</font>
vim +39 nginx.conf<br>... ...<br> server {<br> listen {{http_port}} default_server;<br> listen [::]:{{http_port}} default_server;<br> server_name _;<br>... ...
vim trigger.yml # 修改nginx服务的端口为8000,重启nginx<br>---<br>- name: configure nginx<br> hosts: webservers<br> vars:<br> http_port: "8000" # 定义nginx.conf中的变量和值<br> tasks:<br> name: upload nginx.conf # 上传nginx.conf<br> template:<br> src: ./nginx.conf<br> dest: /etc/nginx/nginx.conf<br> - name: restart nginx # 重启服务<br> service:<br> name: nginx<br> state: restarted
# 第一次执行trigger.yml,上传文件和重启服务两个任务的状态都是黄色changed<br><br># 第二次执行trigger.yml,上传文件的任务状态是绿色的ok,重启服务任务的状态是黄色changed
vim trigger.yml<br>---<br>- name: configure nginx<br> hosts: webservers<br> vars:<br> http_port: "80"<br> tasks:<br> - name: upload nginx.conf<br> template:<br> src: ./nginx.conf<br> dest: /etc/nginx/nginx.conf<br> notify: restart nginx # 通知restart httpd需要执行<br> handlers:<br> - name: restart nginx<br> service:<br> name: nginx<br> state: restarted
# 既然配置文件没有改变,那么服务就不应该重启<br># 修改Playbook,只有配置文件变化了,才重启服务<br><br># 第一次运行Playbook,因为第1个任务是黄色的changed,所以handlers中的任务也被触发执行<br># 第二次运行Playbook,因为第1个任务是绿色的OK,也就不会再触发执行其他任务了
三、when条件<br>只有满足某一条件时,才执行任务<br> 常用的操作符:<br> ==:相等<br> !=:不等<br> >:大于<br> <:小于<br> <=:小于等于<br> >=:大于等于<br> 多个条件或以使用and或or进行连接<br> not 取反: not 5 >30 ---5不大于30<br> when表达式中的变量,可以不使用{{}}
vim when1.yml # 当dbs组中的主机内存大于2G的时候,才安装mysql-server<br>---<br>- name: install mysql-server<br> hosts: dbs<br> tasks:<br> - name: install mysql-server pkg<br> yum:<br> name: mysql-server<br> state: present<br> when: ansible_memtotal_mb>2048<br>
yum -y install cowsay<br>cowsay hello world > motd <br>开机登录设置,/etc/motd<br><br># 多条件---系统发行版是Rocky8才执行任务<br># /etc/motd中的内容,将会在用户登陆时显示在屏幕上<br><br>停止: echo 'nocows = 1 ' >> ansible.cfg<br>
vim when2.yml <br>---<br>- name: when condition<br> hosts: webservers<br> tasks:<br> - name: modify /etc/motd<br> copy:<br> dest: /etc/motd<br> src: motd<br> when: > # 以下三行合并成一行<br> ansible_distribution == "Rocky"<br> and<br> ansible_distribution_major_version == "8"
四、regitster注册变量<br>“register”模块是用于捕获和保存任务执行结果的,它允许将其他任务的输出作为变量使用。<br> register是一个关键字,可以将任务执行的结果赋值给指定的变量名称。<br> 这个变量可以在后续任务中使用。<br> register模块可以捕获各种类型的输出,包括stdout、stderr、rc、changed等。<br> 它可以与其他模块一起使用,例如“when”条件、“loop”循环等。
创建/tmp/regfile1.txt,并打印创建结果<br>vim reg1.yml<br>---<br>- name: create file /tmp/regfile1.txt<br> hosts: web1<br> tasks:<br> - name: create file<br> file:<br> path: /tmp/rgefile1.txt<br> state: touch<br> register: result<br> - name: display output<br> debug:<br> msg: "{{result}}"
创建文件/tmp/ademo/abc。如果创建不成功,则通过debug输出create failed<br>vim reg2.yml<br>---<br>- name: create file /tmp/ademo/abc<br> hosts: web1<br> ignore_errors: yes<br> tasks:<br> - name: create file<br> file:<br> path: /tmp/ademo/abc<br> state: touch<br> register: result<br> - name: debug output<br> debug:<br> <font color="#a23c73">msg: "create failed"<br> when: result.failed</font>
day04
任务块
1.<br>可以通过block关键字,将多个任务组合到一起 <br>可以将整个block任务组,一起控制是否要执行
vim block1.yml<br>-1 ---<br> 2 - name: block tasks<br> 3 hosts: webservers<br> 4 tasks:<br> 5 - name: defind a group of tasks<br> 6 block:<br> 7 - name: install nginx<br> 8 yum:<br> 9 name: nginx<br> 10 state: present<br> 11 <br> 12 - name: start ngxin<br> 13 service:<br> 14 name: nginx<br> 15 state: started<br> 16 when: ansible_distribution=="Rocky" # 条件为真才会执行上面的任务
block和rescue、always联合使用:<br> block中的任务都成功,rescue中的任务不执行<br> block中的任务出现失败(failed),rescue中的任务执行<br> block中的任务不管怎么样,always中的任务总是执行
vim block2.yml<br>---<br>- name: block test<br> hosts: webservers<br> tasks:<br> - name: block / rescue / always test1<br> block:<br> - name: touch a file<br> file:<br> path: /tmp/abcd/test11.txt<br> state: touch<br> rescue:<br> - name: touch file test22.txt<br> file:<br> path: /tmp/test22.txt<br> state: touch<br> always:<br> - name: touch file test33.txt<br> file:<br> path: /tmp/test33.txt<br> state: touch<br>
# 因web1上没/tmp/abcd目录,<br> 所以block中的任务失败。<br> 但是playbook不再崩溃,<br> 而是执行rescue中的任务。<br> always中的任务总是执行
loop循环:<br>相当于shell中for循环<br>变量名是固定的,叫item
vim loop1.yml<br>---<br>- name: use loop<br> hosts: webservers<br> tasks:<br> - name: create directory<br> file:<br> path: /tmp<font color="#e74f4c">/{{item}}</font><br> state: directory<br> loop: [aaa,bbb,ccc,ddd,eee] #python的写法<br>相当于:for item in aaa bbb....<br>在t主机上创建5个目录/tmp/{aaa,bbb,ccc,ddd,eee}
---<br>- name: use loop<br> hosts: webservers<br> tasks:<br> - name: create directory<br> file:<br> path: /tmp/{{item}}<br> state: directory<br> loop: # playbook 的写法<br> - aaa<br> - bbb<br> - ccc<br> - ddd<br> - eee
# 使用复杂变量。创建zhangsan用户,密码是123;创建lisi用户,密码是456<br># item是固定的,用于表示循环中的变量<br># 循环时,loop中每个-后面的内容作为一个整体赋值给item。<br># loop中{}中的内容是自己定义的,写法为key:val<br># 取值时使用句点表示。如下例中取出用户名就是{{item.uname}}
vim loop_user.yml<br>---<br>- name: create users<br> hosts: webservers<br> tasks:<br> - name: create multiple users<br> user:<br> name: "{{item.uname}}"<br> password: "{{item.upass|password_hash('sha512')}}"<br> loop:<br> - {"uname": "zhangsan", "upass": "123"}<br> - {"uname": "lisi", "upass": "456"}
role 角色<br>
为了实现playbook重用,可以使用role角色<br> 角色role相当于把任务打散,放到不同的目录中<br> 再把一些固定的值,如用户名、软件包、服务等,用变量来表示<br> role角色定义好之后,可以在其他playbook中直接调用
1.使用常规playbook,修改/etc/motd的内容<br>vim motd<br>Hostname: {{ansible_hostname}} # facts变量,主机名<br>Date: {{ansible_date_time.date}} # facts变量,日期<br>Contact to: {{admin}} # 自定义变量<br><br>vim motd.yml<br>---<br>- name: modifty /etc/motd<br> hosts: webservers<br> vars:<br> admin: root@tedu.cn # 自定义名为admin的变量<br> tasks:<br> - name: modify motd<br> template:<br> src: motd<br> dest: /etc/motd
2.playbook 的方式:<br># 创建角色<br>1. 声明角色存放的位置<br>vim ansible.cfg <br>[defaults]<br>inventory = hosts<br>roles_path = roles # 定义角色存在当前目录的roles子目录中<br>2. 创建角色目录<br>mkdir roles<br>3. 创建名为motd的角色<br>ansible-galaxy init roles/motd<br>ls roles/motd # 生成了motd角色目录<br>yum install -y tree<br>tree roles/motd/<br>roles/motd/<br>├── defaults # 定义变量的目录,优先级最低<br>│ └── main.yml<br>├── files # 保存上传的文件(如copy模块用到的文件)<br>├── handlers # handlers任务写到这个目录的main.yml中<br>│ └── main.yml<br>├── meta # 保存说明数据,如角色作者、版本等<br>│ └── main.yml<br>├── README.md # 保存角色如何使用之类的说明<br>├── tasks # 保存任务<br>│ └── main.yml<br>├── templates # 保存template模块上传的模板文件<br>├── tests # 保存测试用的playbook。可选<br>│ ├── inventory<br>│ └── test.yml<br>└── vars # 定义变量的位置,推荐使用的位置<br> └── main.yml<br>4. 将不同的内容分别写到对应目录的main.yml中<br>4.1 创建motd模板文件<br>vim roles/motd/templates/motd<br>Hostname: {{ansible_hostname}}<br>Date: {{ansible_date_time.date}}<br>Contact to: {{admin}}<br>4.2 创建变量<br>vim roles/motd/vars/main.yml # 追加一行<br>admin: zzg@tedu.cn<br>4.3 创建任务<br>vim roles/motd/tasks/main.yml # 追加<br>- name: modify motd<br> template:<br> src: motd # 这里的文件,自动到templates目录下查找<br> dest: /etc/motd<br>5. 创建playbook,调用motd角色<br>vim role_motd.yml<br>---<br>- name: modify motd with role<br> hosts: webservers<br> roles:<br> - motd<br>6. 执行playbook<br>ansible-playbook role_motd.yml
创建名为pkgs的角色。用于装包。包名使用变量pkg代表<br> 创建inst_nginx.yml,调用pkgs角色,安装nginx<br> 创建inst_mysql.yml,调用pkgs角色,安装mysql<br><br># 1. 创建名为pkgs的角色。<br># 1.1 创建角色目录<br>ansible-galaxy init roles/pkgs<br># 1.2 创建装包的任务,包名使用变量pkg代表<br>vim roles/pkgs/tasks/main.yml <br>---<br># tasks file for roles/pkgs<br>- name: install rpm pkg<br> yum:<br> name: "{{pkg}}"<br> state: present<br># 1.3 定义变量<br>vim roles/pkgs/defaults/main.yml <br>---<br># defaults file for roles/pkgs<br>pkg: nginx<br># 2. 创建inst_nginx.yml,调用pkgs角色,安装nginx<br>vim inst_nginx.yml<br>---<br>- name: install nginx pkg<br> hosts: webservers<br> roles:<br> - pkgs<br>ansible-playbook inst_nginx.yml<br># 3. 创建inst_mysql.yml,调用pkgs角色,安装mysql-server<br> vim inst_mysql.yml <br>---<br>- name: install mysql pkg<br> hosts: dbs<br> vars:<br> pkg: mysql-server<br> roles:<br> - pkgs
Role目录结构说明如下:<br><br>tasks/:包含Role的主要任务列表,通常是一个名为main.yml的文件。<br><br>handlers/:包含Role的handlers列表,通常是一个名为main.yml的文件。<br><br>files/:包含Role使用的文件。<br><br>templates/:包含Role使用的模板文件。<br><br>vars/:包含Role使用的变量文件。<br><br>defaults/:包含Role的默认变量文件。<br><br>meta/:包含Role的元数据,包括Role的作者、依赖关系等。<br><br>tests/:包含Role的测试用例。<br><br>以上是Role目录结构的基本要素,可以根据实际情况进行调整和扩展。
加解密文件<br>ansible-vault命令
ansible-vault encrypt 文件名 加密文件<br>ansible-vault decrypt 文件名 解密文件<br>ansible-vault rekey 文件名 重置密码<br>ansible-vault view 文件名 不解密查看文件<br>
使用密码文件进行加解密:<br>echo '密码' > pass.txt<br>echo '内容' > data.txt<br>ansible-vault <font color="#e74f4c">encrypt </font>--vault-id=pass.txt data.txt 用文件加密文件<br>ansible-vault <font color="#e74f4c">decrypt</font> --vault-id=pass.txt data.txt 解密 <br>
使用ansible管理远程主机,加密执行文件,执行playbook时,通过--ask-vault-password选项提示输入密码<br>ansible-vault encrypt 文件名 加密文件<br>ansible-playbook --ask-vault-password 文件名 用密码执行文件,此时没有解密,解密还需用decrypt<br>
sudo命令:<br>一般用于普通用户执行需要root权限的命令<br>在web1上配置zhangsan拥有sudo权限
web1:<br>visudo # 将会打开vi,在尾部追加以下一行<br>zhangsan ALL=(ALL) ALL<br><br>或者单个允许:<br>Cmnd_Alias USERS=/usr/sbin/useradd,/usr/bin/passwd<br>zhangsan ALL=(ALL) USERS<br><br>visudo # 在最后追加一行 # 配置lisi不输入密码可以直接运行sudo<br>lisi ALL=(ALL) NOPASSWD: ALL
特殊的主机清单变量<br>如果远程主机没有使用免密登陆,如果远程主机ssh不是标准的22端口,<br>可以设置特殊的主机清单变量<br> ansible_ssh_user:指定登陆远程主机的用户名<br> ansible_ssh_pass:指定登陆远程主机的密码<br> ansible_ssh_port:指定登陆远程主机的端口号
ansible all -m file -a "path=/root/.ssh/authorized_keys state=absent"<br> # 删除远程主机的/root/.ssh/authorized_keys,以便恢复通过密码登陆<br>mkdir myansible # 创建新的工作目录<br>cd myansible<br><br>vim ansible.cfg<br>[defaults]<br>inventory = inventory<br><br>vim inventory<br>[group1]<br>web1<br>web2<br>db1<br><br># 修改web1 ssh服务的端口为220<br>systemctl stop firewalld<br>echo 'Port 220' >> /etc/ssh/sshd_config<br>systemctl restart sshd<br>ssh -p220 192.168.88.11 # 退出再登陆时,需要指定端口号<br><br># 配置ssh通过用户名、密码管理远程主机,通过220端口连接web1<br>vim inventory <br>[group1]<br>web1 ansible_ssh_user=root ansible_ssh_pass=a ansible_ssh_port=220<br>web2 ansible_ssh_user=root ansible_ssh_pass=a<br>db1 ansible_ssh_user=root ansible_ssh_pass=a
0 条评论
下一页