目录
循环
简单循环
{{item}} 迭代变量名称
loop:
- value1
- value2
- ... //赋值列表
{{item}} //迭代变量名称
循环散列或字典列表
- name: create file
hosts: host1
tasks:
- name: file moudle
service:
name: "{{ item.name }}"
state: "{{ item.state }}"
loop:
- name: httpd
state: started
- name: vsftpd
state: stopped
~
条件
when:
- 条件1
- 条件2
条件判断
= //value == “字符串”,value == 数字 解释
< //value < 数字
> //value > 数字
<= //value <= 数字
>= //value >= 数字
!= //value != 数字
is defined value //value is defined 变量存在
is not defined //value is not defined 变量不存在
in //value is in value 变量为
not in //value is not in value 变量不为
bool变量 为true value //value的值为true
bool变量 false not value //value的值为false
多条条件组合
when:
条件1 and 条件2
- 条件1
- 条件2 //当条件1和条件2都为真
when:
条件1 or 条件2 //满足其中一个
when: >
条件1
or
条件2 //满足其中一个
创建两个用户 user1
和 user2
, user1
的 UID 是 6666
,注释是 user1 comment
,user2
的 UID 是 7777
,没有注释。
vim userlist.yml
userlist:
- name: user1
id: 6666
comment: user1 comment
- name: user2
id: 7777
vim usercreate.yml
- name: create user
hosts: all
vars_files: ./userlist.yml
tasks:
- name: create user with comment
user:
name: "{{item.name}}"
uid: "{{item.id}}"
comment: "{{item.comment}}"
state: present
when: item.comment is defined
loop:
"{{userlist}}"
- name: create user without comment
user:
name: "{{item.name}}"
uid: "{{item.id}}"
state: present
when: item.comment is not defined
loop:
"{{userlist}}"
触发器
notify: //触发器当遇到更改是触发handlers
handlers: //触发器触发后执行的动作
在指定的服务器上部署网站,并创建一个简单的主页
vim webs.yml
webs:
- name: bbs.westos.org
doc: /var/www/virtual/westos.org/bbs/html
index: "bbs.westos.org's page"
- name: login.westos.org
doc: /var/www/virtual/westos.org/login/html
index: "login.westos.org's page"
- name: www.westos.org
doc: /var/www/html
index: "www.westos.org's page"
vim html.j2
{% for web in webs %}
{% if web.name is not defined %}
<VirtualHost _default_:80>
{% elif web.name is defined %}
<VirtualHost *:80>
ServerName {{web.name}}
{% endif %}
DocumentRoot {{web.doc}}
</VirtualHost>
{% endfor %}
vim web.yml
- name: Create website index page
hosts: all
vars_files: ./webs.yml
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: service
service:
name: httpd
state: started
enabled: no
- name: Create index.html for each website
template:
src: ./html.j2
dest: "/etc/httpd/conf.d/vhost.conf"
notify: restart httpd
- name: create directory
lineinfile:
path: "{{item.doc}}/index.html"
line: "{{ item.index }}"
create: yes
loop: "{{webs}}"
handlers:
- name: restarted httpd
service:
name: httpd
state: restarted
处理失败任务
ignore_errors
作用:当play遇到任务失败时会终止
ignore_errors:yes //将会忽略任务失败使下面的任务运行
- name: ignore
hosts: all
tasks:
- name: test file
shell: test -e /mnt/test
ignore_errors: no/yes
- debug:
msg: hello
force_handlers
作用: 当任务失败后play被终止也会调用触发器进程
- name: ignore
hosts: all
force_handlers: yes
tasks:
- name: test file
shell: test -e /mnt/test
notify: DEBUG
- name: error
yum:
name: haha
handlers:
- name: DEBUG
debug:
msg: hello
changed_when
作用:控制任务在何时报告它已进行更改,用于指定一个条件,当这个条件成立时,任务将被标记为已更改。
- name: ignore
hosts: all
force_handlers: yes
tasks:
- name: test file
lineinfile:
path: /mnt/test
line: "hello world"
notify: DEBUG
changed_when: false
handlers:
- name: DEBUG
debug:
msg: hello
failed_when
作用:当符合条件时会强制任务失败
- name: ignore
hosts: all
force_handlers: yes
tasks:
- name: test file
shell: echo hello
register: HA
failed_when: "'hello' in HA.stdout"
block
block: //定义要运行的任务
rescue: //定义当block句子中出现失败任务后运行的任务
always: //定义最终独立运行的任务
给/dev/sdb分区,如果/dev/sdb不存在请输入:/dev/sdb is not exist ,如果/dev/sdb不足1.5G请输出/dev/sdb is less than 1.5G
并建立800M大小的/dev/sdb1,挂载到/westos上
- name: fdisk
hosts: all
vars:
mount_point: /westos
device: /dev/sdb
tasks:
- name: Check if device exists
stat:
path: "{{ device }}"
register: device_stat
ignore_errors: yes
- name: Fail if device does not exist
debug:
msg: "/dev/sdb is not exist"
when: not device_stat.stat.exists
- name: create /dev/sdb1
block:
- name: create 1500M
parted:
device: "{{device}}"
number: 1
state: present
part_end: 1500GiB
when: device_stat.stat.exists
- debug:
msg: /dev/sdb is lee than 1.5G
rescue:
- name: create 800M
parted:
device: "{{device}}"
number: 1
state: present
part_end: 800MiB
when: device_stat.stat.exists
notify:
- Format partition
- Mount partition
handlers:
- name: Format partition
filesystem:
fstype: ext4
dev: "{{device}}1"
- name: Mount partition
mount:
path: "{{ mount_point }}"
src: "{{ device}}1"
fstype: ext4
state: mounted