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