架构师的成长之路初片~自动化篇之Ansible
1)装包:
ansible_soft.ta.gz 内的包
yum -y install ./* //当前目录下的所有文件
2)修改配置文件
主配置文件/etc/ansible/ansible.cfg
*ansible对配置文件的查找顺序
首先检测ANSIBLE_CONFIG变量定义的配置文件
其次检测当前目录下的ansible.cfg文件
再次检查家目录下的ansible.cfg文件
最后检查/etc/ansible.cfg文件
普通模块:没有智能判断的能力
command shell ping
在执行多次以上的命令时,会执行命令而不能判断该命令是否以及执行
专属模块:copy file fetch linginfile yum.....
专属模块可以判断该命令是否执行,如已执行,则不会重复执行该命令。
在~目录创建ansible
cd ansible
vim ansible.cfg
[defaults]
inventory=./inventory
vim inventory
[test]
n1
n2
[test2]
n3
n4
[cluster:children] //嵌套组(:children 为关键字)
test
专属模块必记:
1) file
2) copy
3) fetch
4) lineinfile
5) replace
6) user 添加密码:必记: password={{'123456' | password_hash('sha512')}}
7) yum
8) yum_repoistory
9) service
10) lvg
11) lvol
12) parted
13) firewalld
编写playbook------剧本
格式:
#代表注释,一般第一行为三个横杠(---)
键/值(key/value)对使用 ” . “ 表示,数组使用 ” - “表示,” - “后面有空格
文件名以 .yml 或 .yaml 结尾 ,区分大小写
缩进由两个或两个以上空格组成
相同层级必须缩进对其,缩进代表层级关系
跨行数据需要使用 > 或者 | ( | 会保留换行符)
playbook 语法格式
每个play中可以包含
- hosts tasks vars 等元素组成
hosts由一个或多个组或主机组成,逗号分隔
可以使用 -f 选项自定义并发量
/etc/ansible/ansible.cfg
forks=5 //ssh并发量
host_key_checking=False //是否检验密钥
特殊模块:
setup模块
ansible tesst -am setup //可看到test中的所有变量
调用变量:
debug模块: //使用debug模块可以输出常量信息内容或变量信息。 类似于 ”echo“
msg: "{{变量}}" //msg参数可以定义信息内容,双大括号在这里时调用变量
2.inventory变量
修改主机签单文件,在node1主机后面追加变量
node1 myvar1="abc" //myvar1是变量名可以自定义,后面abc是变量(myvar)是变量可自定义
[webserver:vars] //给组webserver定义变量
3.playbook变量
hosts:test
vars: //定义变量的关键词
myvar2:abc02
myvar3:abc03
tasks:
-debug:
msg: "{{myvar2}}" //调用变量
4.变量文件
在ansible目录下创建一个 variables.yml 的文件
---
myvar5:abc05
myvar6:abc06
创建调用variables.yml 的文件
---
- hosts:
var_files: /root/ansible/variables.yml
tasks:
-user:
name: "{{myvar5}}"
password:"{{'myvar6 | password_hash('sha512')'}}"
变量的优先级:
playbook>hostFasts>inventory>变量文件
其他模块:
firewalld
template //功能与copy类似,但拷贝文本时可以识别变量
素材:abc.txt text {{ansible_hostname}}
tasks:
src: /ansible/abc.txt
dest /opt/abc.txt
ignore_errors //跳过或忽略错误的模块任务
-template:
src: /ansible/abc.txt
dest: /opt/abc.txt
ignore_errors: true //如果template模块内发生错误,则会跳过此模块。
###
template: 不能调用以 .yml 结尾的文件作为源文件。
###
-hosts:
ignore_errors:true //如与gosts对齐,则对主机执行的所有任务生效。
ansible的高级功能
1)定义handlers任务
在剧本中tasks用来定义任务(一定会执行),handlers也可以定义任务(不一定执行)handlers任务要想执行必须要被别人触发才能执行。
-file: state=touch path=/opt/abc09
notify: handol //调用handlers中的任务名称
handlers: //预定义,与tasks对齐
- name: handol //预备任务,不一定执行
#常用于重复的工作(磁盘格式化)
when 条件判断,条件为真时才能执行某任务
== != > >= < <=
多个条件可以使用and或or 分割。
# when表达式中调用变量不要使用 {{ }}
1)单一条件
tasks:
-debug
msg:ok
when: ansible_hostname != "node1"
2)多个条件
tasks:
-debug:
msg:ok
when: >
ansible_hostname ~= "node2"
and (and 或 or)
ansible_memfree_mb > 100
3)使用block、rescue、always 组合执行任务
使用rescue语句定义在block任务执行失败时要执行的其他任务,还可以使用always语句定义,无论block任务是否成功,都要执行任务。
- hosts: test tasks: -block: - debug: msg:"{{ok}}" rescue: //救援任务,仅block任务失败时执行 - debug: msg:"{{rescue~~~}}" always: //无论block是否成功,都会执行 - debug: msg:"always~~~"
loop循环: //相同任务需要多次执行时避免重复写模块语句
tasks:
-file: state=touch path=/opt/{{item}}
loop:
-: xyz01
-: xyz02
loop循环高级用法,定义子值
tasks:
-user
name: "{{item.myvar1}}"
password: "{{‘item.var1 | password_hash('sha512')’}}"
loop:
- {myvar1: 'abc01',var02: 'xyz02'}