1.playbook的功能
- playbook是由一个或多个play组成的列表
- playbook文件使用YAML来写的
- 模块组成的
2.YAML(playbook使用语言)
简介
- 是一种表达资料序列的格式,类似XML
Yet Another Markup Language
2001年首次发表
www.yaml.org - 特点:(接近shell和python,易于上手)
可读性好
和脚本语言交互性好
易于实现
适用程序执行流梳理方式
可扩展性强 - 语法简介
在文件中用[—]开始
在文件中用[…]结尾(可省略)
次行一般书写文件内容
缩进严格
大小写敏感
key/value 可以多行书写也可一行书写,一行书写用,隔开
value 可以是字符串,也可以是list
一个play需要包括name和tasks
name 是描述
tasks是动作
一个name只能包含一个task
扩展名称yml或者yaml - yaml列表两种格式
[Linux,C++,java,python]
- Linux
- C++
- java
- python
- YAML的字典
字典作用存放键值
name: westos
age:12
jobs:linux
{name:“westos”, age: “12”, jobs: “linux”} - playbook执行命令
ansible-playbook xxx.yml …
–check|-C ##检测语法,预执行
–syntax-check ##check language,只检测语法,
–list-hosts ##列出hosts
–list-tags ##列出tags
–list-tasks ##列出task
–limit ##指定执行主机
-v -vv ##现实过程
vim test.yml
---
- name: test yml ##名字
hosts: 192.168.1.212 ##主机
tasks: ##任务
- name: action
shell:
hostname
ansible-playbook
- -C test.yml ##检测语法,预执行
ansible-playbook --list-hosts test.yml ##检测运行主机
ansible-playbook --list-tags test.yml ##列出tags部分
ansible-playbook --list-tasks test.yml ##列出动作,task部分
ansible-playbook --limit 192.168.1.212 test.yml -C ##指定执行主机
ansible-playbook test.yml -v ##yml详细x’h’n’j
ansible-playbook test.yml -vv
vim test.yml
---
- name: test yml
hosts: 192.168.1.212
tasks:
- name: action
shell:
hostname
- name: check user ##列表中的每一个元素前必须加-,字典不加
shell:
id luqq
- ansible-playbook test.yml
- ansible-playbook --list-task test.yml
- playbook的核心组件
name ##可选,建议使用多用于说明
hosts ##受控主机列表
tasks ##任务
用于选择执行部分代码 - vim 设定技巧
autocmd FileType yaml setlocal ai ts=2 sw=2 et
-
setlocal ##设定当前文件
ai ##自动退格对齐 auto indent
ts ##tab键长度为2空格 tabstop=2
sw ##缩进长度为2 shiftwidth=2
et ##把tab键变成空格 expandtab -
部署aphache服务:
可以直接查找范例:ansible-doc firewalld | less
vim Apache.yml
---
- name: Apache server
hosts: 192.168.1.212
tasks:
- name: install apache ##安装服务
dnf:
name: httpd
state: latest
disable_gpg_check: yes
- name: start apache ##开启服务
service:
name: httpd
state: started
enabled: yes
- name: firewalld setup ##火墙设定
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
zone: public
- name: create index ###默认发布文件
lineinfile:
path: /var/www/html/index.html
line:“hello,westos”
create:yes
-
ansible-playbook test.yml
-
部署vsftpd服务
---
- name: vsftp server
hosts: 192.168.1.212
tasks:
- name: install vsftpd
dnf:
name: vsftpd
state: latest
- name: install lftp
dnf:
name: lftp
state: latest
- name: anon yes
lineinfile:
path: /etc/vsftpd/vsftpd.conf
state: present
regexp: "anonymous_enable"
line: "anonymous_enable=YES"
- name: start vsftpd
service:
name: vsftpd
state: started
enabled: yes
- name: firewalld setup
firewalld:
service: ftp
permanent: yes
state: enabled
- name: firewalld setup
firewalld:
service: ftp
permanent: yes
state: enabled
immediate: yes
zone: public
- name: touch westosfile
file:
path: /var/ftp/westosfile
state: touch
开启dns服务
同一模块不可进行两个相同操作
主机:由清单,事实收集或注册的任务
变量优先级设定:
狭窄范围有限与广域范围
3.变量设定和使用方法
1.在play中设定变量
- name: test
hosts: 192.168.1.212
vars:
NAME: westoslee
tasks:
- name: create user
user:
name: "{{NAME}}"
state: present
2.在文件中指定变量
vim user.yml
---
NAME: westoslinux
test.yml
---
- name: test
hosts: 192.168.1.212
vars_files: user.yml
tasks:
- name: create user
user:
name: "{{NAME}}"
state: present
- ansible-playbook test.yml
3.使用变量
tasks:
- name: create user
user:
name: "{{NAME}}"
4.设定主机变量和清单变量
- 在定义主机变量和清单变量时使用
无需指定
[westos:vars]
NAME=westoslinux2 - test.yml
---
- name: test
hosts: westos
tasks:
- name: create user
user:
name: "{{NAME}}"
state: present
5.目录设定变量
group_vars ##清单变量,目录中的文件名称与主机清单名称一致
host_vars ##主机变量,目录中的文件名称与主机名称一致
cat group_vars/westos
---
NAME: linux
cat inventory
[westos]
192.168.1.212
cat test.yml
---
- name: test
hosts: westos
tasks:
- name: create user
debug:
msg: "{{NAME}}"
---
- name: test
hosts: 192.168.1.212
tasks:
- name: create user
debug:
msg: "{{NAME}}"
cat host_vars/192.168.1.100
---
NAME: linux
6.对变量进行覆盖
- ansible-playbook test.yml -e “NAME=luqq”
7.使用数组定义变量
user1.yml
---
USER:
lee:
age: 18
obj: linux
westos:
age: 20
obj: java
vim test.yml
---
- name: test
hosts: 192.168.1.212
vars_files: ./user1.yml
tasks:
- name: create user
debug:
var: USER['lee']['age']
---
- name: test
hosts: 192.168.1.212
vars_files: ./user1.yml
tasks:
- name: create user
debug:
var: USER['lee']['age']
- debug:
msg: "{{USER}}"
8.注册变量
register把模块输出注册到指定字符串中
vim test1.yml
---
- name: test register
hosts: 172.25.254.109
tasks:
- name: hostname command
shell:
hostname
register: info
- name: show messages
shell:
echo "{{info['stdout']}}"
9.事实变量
事实变量是ansible在受控主机中自动检测出的变量
事实变量中还有与主机相关的信息
当需要使用主机相关信息时不需要采集赋值,直接调用即可
因为变量信息为系统信息所以不能随意设定仅为采集信息,古被称为事实变量
去掉ansible以外部分为ansible字典变量
---
- name: test register
hosts: 172.25.254.109
gather_facts: yes
tasks:
- lineinfile:
path: /mnt/hostname
line: "{{ansible_facts['fqdn']}}"
create: yes
- gather_facts: yes ##在playbook开启事实变量收集
10.魔法变量
hostvars ##ansible软件内部信息
group_names ##当前受管主机所在组
groups ##列出清单中所有的组和主机
inventory_hostname ##包含清单中配置的当前受控主机
ansible localhost -m debug -a "var=group_vars"
ansible localhost -m debug -a "var=inventory_hostname"
ansible localhost -m debug -a "var=hostvars"
ansible localhost -m debug -a "var=group_names"
ansible localhost -m debug -a "var=groups"
11.JINJA2模板
介绍
jinja2是python下一个被广泛应用的模板引擎
他的设计思想来源于Django的模板引擎
并扩展了其语法和一系列强大的功能
其中最显著的一个是增加了沙箱
j2模板书写规则
{# xxxxxx #} ##注释说明文件用途
127.0.0.1 localhost ##文件内容
{{ansible_facts[‘all_ipv4_adresses’]}} ##使用事实变量
for循环
{% for NAME in users %} ##循环列表中变量
name: {{NAME['name']}} ##输出
{% endfor %} ##循环中止
if判定
{% if NAME['age'] is not defined %} ##if循环判定
age: x ##输出
{% endif %} ##终止循环
loop.index ##循环迭代计数从1开始
loop.index0 ##循环迭代计数从0开始
cat userlist.yml
---
- name: test j2
hosts: westos
vars:
users:
- name: westos
age: 18
- name: linux
- name: lee
age: 20
tasks:
- name: test j2
template:
src: ./test.j2
dest: /mnt/hosts
cat test.j2
{% for NAME in users %}
name: {{NAME['name']}}
{% if NAME['age'] is defined %}
age: {{NAME['age']}}
{%endif%}
{% if NAME['age'] is not defined %}
age: x
{% endif %}
{% endfor %}
12. Ansible的加密控制
1. ansible-vault create westos.yml ##创建加密文件
2.ansible-vault create--vault-password-file=password westos2.yml ##不输入密码创建加密文件
3.ansible-vault encrypt westos.yml ##加密已有文件
4.ansible-vault encrypt ipdns..yml --vault-password-file=password ##不输入密码加密已有文件
5.ansible-vault decrypt westos.yml --vault-password-file=password ##不输入密码解密文件
6.ansible-vault view westos.yml ##查看加秘文件
7.ansible-vault rekey westos1.yml ##对加密文件重新设定密码
8.ansible-vault decrypt westos1.yml --output=westos4.yml ##将文件解密至其他文件