一、inventory---主机清单
1.1 支持对主机分组,每个组内可以定义多个主机,可以把一台主机分别放在两个组内。
把.10到.100的主机全部放在这个组里面(/etc/ansible/hosts:配置文件)
有的主机不是以ip地址放在主机清单里的,也可以用字母作为范围
如果远程的主机ssh的端口变了需要在ip后面加上端口
1.2 inventory(主机清单)可添加的一些变量
1.3修改主机清单上的小实验
删除.200主机的秘钥对信息
这样在.100主机ssh连接.200这台主机时就需要密码验证
并且修改配置文件把.200主机的ssh端口号改成4499
重启ssh服务(关闭防火墙!!!)
到.100这台主机上来修改/ect/ansible/hosts文件,然后保存退出
设置完后使用ansible运行命令依旧可以查询出来网卡信息说明配置没有问题
1.4如果整个组都没有设置密钥对,我们可以对整个组设置一个变量
我们首先删除.250主机上的密钥对
在到.100主机上配置主机清单
使用ansible命令是可以查询出webservers组的网卡信息的
1.5如果你想影响配置文件中的所有组的配置可以
vim /ect/ansible/hosts
[all:vars]
ansible_port=22
1.6组的嵌套
问题:有的时候想单独调用一个组去配置,有的时候需要把两个组同时调用配置
解决方法:
重新定义一个组名
【webs:children】
nginx
apache
vim /ect/ansible/hosts 在100主机上修改配置文件
用ansible命令是可以查看到所有组的网卡信息的
二、Playbooks---剧本
2.1 playbooks的组成
- 1.Tasks:任务,可以ansible的模板将多个操作组织成一个playbooks中运行
- Variables:变量
- Templates:模板
- Handlers:处理器:当changed状态条件满足时,(notify)触发执行的操作
- Roles:角色,可以多角色复用
2.2Playbooks剧本的格式
剧本的文件类型是yaml格式
--- ###yaml文件的开始
- name :first play ## 一个play的名称
gather_facts:false ##设置facts的信息收集,如果选择否,将不可以引用facts收集的信息的值
(setup就是用facts收集各个主机的信息的)
hosts:webservers ###指定在那个主机组去执行任务,要是多个主机组,用冒号分隔
remote_user:root ##指定以什么身份去执行任务
tasks: ##定义任务列表,任务列表中的各个任务按次序在指定主机组上执行
- name:test connection ## -代表一个列表每个任务都用-标识出来,name指定任务名称
ping: ## 指定使用的模块名字,如果后面需要使用命令用引号括起来
##有很多模块后面是需要参数的,需要用键值对的方式来表示
例如:开启防火墙 name 指定服务名 state指定服务的状态
- name:disable selinux
command: “/sbin/setenforce 0” ##command模块和shell模块无需使用键值对的格式
ignore errors:True ##如果执行命令的返回值不为0,就会报错,tasks停止, 可以使用ignore errors:True忽略失败的任务,因为setenforce如果本来就是永久关闭的话,在 执行setenforce 0 返回值就是1
- name : install httpd ##设置一个任务名称为install httpd
yum: name=htppd state=latest ##使用yum模块 来下载httpd服务 yum模块的参数用键值对表示
- name:install configuration file for httpd
copy:src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf ##需要一个准备好的httpd.conf 文件
notify: "restart httpd" ##notify:相当于一个触发器,如果上面做出改变,那就回触发对应名称的handlers操作(handlers操作在下面写的)双引号中的就handlers中定义的名称
- name: start httpd service
service: enabled=true name=httpd state=started
handlers: ##就是handlers中定义的就是任务,此处handlers中的任务使用的是service模块
- name : restart httpd
service:name=httpd state=restarted
ansible在执行完某个任务之后并不会立即执行对应的handlers,他会在执行完所有任务之后在去执行handlers,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次的重启
最后运行playbooks
ansible-playbook test1.yaml ##test1.yaml 剧本名称
三、编写palybook
编写yaml文件
[root@localhost ansible]# mkdir playbook ##创建一个文件夹放剧本
[root@localhost ansible]# cd playbook/
[root@localhost playbook]# vim demo1.yaml ##编写剧本
ansible-playbook demo1.yaml ##运行yaml文件
小实验二:
环境.200这台主机把vim/etc/selinux/conifg 的核心防护状态调整为disabled,最后getenforce在检查一遍
在.100主机上编写playbook的的vim demo2.yaml文件,ansibles-playbook demo2.yaml 执行一遍
把ignore_errors注释删掉之后
他是忽略掉的
小实验:写一个安装apache的palybook的剧本
只装了一台.200
如果/etc/httpd/conf/httpd.conf文件有变化,就会触发notify
执行命令后会有这个
小实验:安装nginx
首先准备好nginx.repo到/opt目录因为nginx 的nginx.conf配置文件不要改,只有一个default.conf需要改
执行文件
四、 运行playbook时的参数
-k:用来交互输入ssh密码
-K:用来交互输入sudo密码,进行用户的提权
-u:指定用户来执行
ansible-playbook test1.yaml --syntax=check ##用来检查yaml文件的语法是否正确
--list-task ##检查tasks任务
--list-hosts ##检查生效的主机
--start-at-task=‘install httpd’ 指定从某个task开始运行
yaml文件故意写错
他会提醒你
五、定义和引用变量
vars 定义一个变量 filename:abc.txt
下面在去创建
去101主机查看opt
5.1遍历定义的变量
遍历定义的变量(二)
效果也是一样的
遍历定义的变量(三)
把变量全部都装到一个中括号里面
一个列表中有两个变量,可以用item.变量名去调用
也可以这样定义变量
两个列表都输出
两个列表整体输出
合并输出,两个列表组合
六、条件判断
当when指令的值为true时,则该任务执行,否则不执行
也可以 != 不等于 <= 小于等于 >=下雨等于
when指令的条件里是可以不用双引号的
inventory_hostname 主机清单里的主机名 也可以等于ip地址也可以是主机名
七、Templates模块
创建了一个Templates模板,这个模板文件是把nginx(看你装什么应用,用这个应用)的配置文件常用的一些配置(监听端口,主机名,网页文件等)做了变量,复制生成一个**.j2的文件(模板),然后yaml文件(编写好的剧本)在把带有变量的模板文件传到远程主机作为主机的应用配置文件,我们在主机清单,把变量的值直接定义到里面。以后改一些端口之类的就不用去远程主机的配置文件里面了,直接在/ect/ansible/hosts下面修改即可。
##把nginx的配置文件里面的常改的配置改成变量,web_port ,nginx_servername,nginx_wwwroot
把修改好的配置文件复制成后缀名为.j2模板,然后修改管理主机的主机清单,把常用的变量的定值写到里面(就是主机组里面的webservers和dbservers)
写的yaml文件
其中主机清单上的目录可以用item去调用可以少写一点代码
其中when是和file是一个级别的需要在一行
总结
playbook的列表和单个值
引用取值列表中某个对象的值
playbook的循环