一 . linux的单双引号区别
a=10
echo '$a' 结果$a
echo "$a" 结果10
二 . playbook 剧本
1. 操作都是幂等(操作以后就不会在操作了)的
2. 为什么要用playbook?
有一些好的功能
ymal规范(必须严格遵守):
字典:
key: value(冒号后边必须有空格)
列表:
- (以短横杠开头)
如:
- attila: shuai
olsen: mei
movie:
- name: 复联
salary: 10000
结果:
[ { attila: 'shuai',
olsen: 'mei',
movie: [ { name: '复联', salary: 10000 } ] } ]
playbook的格式
Usage: ansible-playbook [options] playbook.yml [playbook2 ...]
-C, --check #白跑,执行但是不会有结果
--list-hosts #列出符合的主机
-f FORKS, --forks=FORKS #做并发
--syntax-check #检查语法
-k, --ask-pass #输入密码
单个playbook
!!!必须遵守ymal规范
- hosts: web # 指定运行命令的主机
remote_user: root #可以不写,默认是root
tasks: # 任务列表
- name: createuser # 任务1,必须是name
user: name=olsen1 home=/opt/olsen1 uid=666 # 指定模块
- name: copyfile # 任务2
copy: src=/opt/xxx.txt dest=/opt/xxx1.txt
# 执行任务的顺序是,当web组里的所有服务器执行完第一个任务之后在执行第二个
ansible-playbook --syntax-check playbook1.yml # 检查语法
ansible-playbook playbook1.yml # 真正的执行
# 多个playbook,就是在一个.yml文件中有复制了多个像单个playbook那样的,了解即可
传参
第一种方式
# playbook3.yml文件
- hosts: web
tasks:
- name: create{{user}}
user: name={{user}}
ansible-playbook -e user=curry1 playbook3.yml
第二种方式
# 修改host文件 vim /etc/ansible/hosts
[web]
192.168.111.129 user=curry2
192.168.111.130 user=kobe2
ansible-playbook playbook3.yml # 129有了curry2,130有了kobe2
第三种方式
# 修改host文件 vim /etc/ansible/hosts
[web]
192.168.111.129
192.168.111.130
[web:vars]
user=curry3
ansible-playbook playbook3.yml # 129和130都有了curry3
第四种方式
# playbook4.yml文件
- hosts: web
vars:
- user: curry4
tasks:
- name: create{{user}}
user: name={{user}}
ansible-playbook playbook4.yml # 129和130都有了curry4
传参优先级: -e > playbook里直接vars > hosts
运行时收集的信息
查看收集信息的命令:
ansible 192.168.111.129 -m setup|more
一些主要的信息
ansible_all_ipv4_addresses #所有的ipv4地址
ansible_all_ipv6_addresses #所有的ipv6地址
ansible_architecture #系统的架构
ansible_date_time #系统时间
ansible_default_ipv4 #默认的ipv4地址
address ip地址
alias 网卡名称
broadcast 广播地址
gateway 网关
netmask 子网掩码
network 网段
ansible_default_ipv6 #默认的ipv6地址
ansible_device_links #系统的磁盘信息
ansible_distribution #系统名称
ansible_distribution_file_variety #系统的基于公司
ansible_distribution_major_version #系统的主版本
ansible_distribution_version #系统的全部版本
ansible_dns #系统的dns 默认udp 端口53
ansible_domain #系统的域 ldap
ipv4 #ipv4地址
ansible_env #系统的环境
ansible_fqdn #系统的完整主机名
ansible_hostname #系统的简写主机名
ansible_kernel #系统的内核版本
ansible_machine #系统的架构
ansible_memtotal_mb #系统的内存
ansible_memory_mb #系统的内存使用情况
ansible_mounts #系统的挂载信息
ansible_os_family #系统家族
ansible_pkg_mgr #系统的包管理工具
ansible_processor #系统的cpu
ansible_processor_cores #每颗cpu的核数
ansible_processor_count #cpu的颗数
ansible_processor_vcpus #cpu的个数=cpu的颗数*每颗cpu的核数
ansible_python #系统python信息
ansible_python_version #系统python的版本
ansible_system #系统名字
tags
# playbook6.yml文件
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/etc/redis.conf
tags: copyfile
- name: start
service: name=redis state=started
ansible-playbook playbook6.yml # 全都执行一遍
ansible-playbook -t copyfile playbook6.yml
# 只执行copy那个命令(把bind的ip修改之后执行这步就可以)
handlers
# playbook7.yml文件
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/etc/redis.conf
tags: copyfile
notify: restart # value必须是要触发的模块的value
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
ansible-playbook -t copyfile playbook7.yml # 不仅执行copy还重启
template(能动态替换)
绝对路径
vim /etc/redis/conf
bind {{ansible_default_ipv4.address}] # 上边setup中的参数
playbook8.yml文件
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
template: dest=/etc/redis.conf src=/etc/redis.conf
tags: copyfile
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
ansible-playbook -t copyfile playbook8.yml
相对路径
mkdir templates
cp /etc/redis/conf templates/
mv redis.conf{,.j2} = mv redis.conf redis.conf.j2 # 改名为.j2格式
playbook9.yml文件
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
# 创建名为templates文件夹(和playbook9.yml在同一文件夹下)直接写文件名就能找到
template: dest=/etc/redis.conf src=redis.conf.j2
tags: copy
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
ansible-playbook -t copyfile playbook9.yml
when(判断)
# playbook10.yml文件
- hosts: web
tasks:
- name: copyfile
copy: content="十步杀一人" dest=/tmp/a.txt
when: ansible_distribution_major_version=="7" # setup的参数
- name: copyfile
copy: content="千里不流行" dest=/tmp/a.txt
when: ansible_distribution_major_version=="6"
ansible-playbook -t copyfile playbook10.yml
with_items(循环)
# playbook11.yml文件
- hosts: web
tasks:
- name: createuser
user: name={{item}} # 必须是item
with_items:
- attila50
- curry50
- kobe50
ansible-playbook -t copyfile playbook11.yml # 创建了上述三个用户
循环两个任务
# playbook12.yml文件
- hosts: web
tasks:
- name: createuser
user: name={{item}}
with_items:
- attila60
- curry60
- kobe60
- name: creategroup
group: name={{item}} # cat /etc/group 能查看组信息
with_items:
- attila60
- curry60
- kobe60
ansible-playbook -t copyfile playbook12.yml # 创建了上述三个用户和三个组
嵌套循环
# playbook12.yml文件
- hosts: web
tasks:
- name: crateuser
user: name={{item.name}} group={{item.group}}
with_items:
- {"name":attila80,"group":attila80}
- {"name":curry80,"group":curry80}
- {"name":kobe80,"group":kobe80}
ansible-playbook -t copyfile playbook12.yml
roles
为什么要使用roles:
- 目录结构清晰
- 可以相互调用 在调用文件中写需要引入的文件 - import_tasks: roles/nginx/tasks/install.yml
- 备份方便
!!! 要注意下面目录结构层级关系
每个文件中的内容展示