1.异常中断
做法1:强制正常
2. 任务依赖
条件依赖:
一个任务是否执行取决于另一个任务的执行结果(成功或失败)。可以通过 when 语句结合任务执行结果的变量来实现。
数据依赖:
一个任务需要使用另一个任务的输出数据作为输入。通常通过 register 关键字将一个任务的输出注册到变量,然后在其他任务中引用该变量。
为了解决这个问题,我们需要有⼀种⽅式能解决我们这种存在依赖关系的任务场景。
注:由于notify涉及到的动作是由handlers创建的,在实践过程先写handlers,再在notify中调用
- hosts: web
remote_user: root
tasks:
- name: create new user
user:
name: nginx-test
system: yes
uid: 82
shell: /sbin/nologin
- name: test new user
shell: getend passwd | grep nginx-test
ignore_errors: True
- name: create web root
file:
name: /data/webserver/html
owner: nginx-test
state: directory
- name: touch web index
shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html
- name: install package
apt:
name: nginx
state: present
- name: copy config
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
- name: copy subconfig
copy:
src: nginx-define.conf
dest: /etc/nginx/conf.d
notify: restart nginx
- name: start service
service:
name: nginx
state: started
enabled: yes # 为了掩饰效果,不要改成restart
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
2. 触发多任务
文件名:05-nginx.yml

3. 标签
给任务添加标签



- hosts: web
tags: host-tags
remote_user: root
tasks:
- name: create new user
user:
name: nginx-test
system: yes
uid: 82
shell: /sbin/nologin
tags: installtask
- name: test new user
shell: getend passwd | grep nginx-test
ignore_errors: True
tags: installtask
- name: create web root
file:
name: /data/webserver/html
owner: nginx-test
state: directory
tags: installtask
- name: touch web index
shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html
tags: installtask
- name: install package
yum:
name: nginx
state: present
tags: installtask
- name: copy config
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
tags: installtask
- name: copy subconfig
copy:
src: nginx-define.conf
dest: /etc/nginx/conf.d
notify:
- restart nginx
- check nginx
tags:
- changetask
- installtask
- name: start service
service:
name: nginx
state: started
enabled: yes
tags: installtask
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
- name: check nginx
shell: netstat -tnulp | grep nginx > /tmp/nginx.test


4 综合实践[T]
5. 变量进阶
ansible all -a "hostname" -o #查看主机名
ansible all -m hostname -a "name=xxx" #修改主机名
需求 想让三台主机的主机名不一样 用ansible如何来实现 例如
10.0.0.12 aaa
10.0.0.15 bbb
10.0.0.18 ccc
变量的多种设定方法
- hosts: all
remote_user: root
tasks:
- name: create file
file:
name: /var/log/var-{{ ansible_fqdn }}.log
state: touch
owner: daemon

1. 主机列表变量
- hosts: web
remote_user: root
tasks:
- name: set hostname
hostname:
name: ansible-{{ name }}.example.com
主机清单下改成这个

实践: 文件名03-v.yml

- hosts: web
remote_user: root
tasks:
- name: set hostname
hostname: name={{ qian }}-{{ name }}{{ hou }}
2. 命令行
3. playbook实践

4. playbook变量基础
- hosts: web
remote_user: root
vars:
- head: ni
- hostid: hao
- tail: .shuai.com
tasks:
- name: set hostname
hostname:
name: "{{ qian }}-{{ name }}{{ hou }}"
出来的结果不是想要的结果 疑? 待解决
ansible-playbook 04-v.yml 执行
ansible web -m shell -a "hostname" -o #查看结果


- hosts: web
remote_user: root
vars_files:
- vars.yaml
vars:
- head: www
- tail: .ansible.top
tasks:
- name: set hostname
hostname: name={{ qian }}-{{ name }}{{ hou }}

6. 模板
server {
listen {{ nginx_port }};
root /data/webserver/html;
location / {
}
}
4.改造playbook.yaml
- hosts: web
remote_user: root
tasks:
- name: install package
yum:
name: nginx
state: present
- name: create web root
file:
name: /data/webserver/html
state: directory
- name: touch web index
shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html
- name: delete default nginx conf
file:
name: /etc/nginx/sites-enabled/default
state: absent
- name: copy config
template:
src: ./templates/nginx-define.conf.j2
dest: /etc/nginx/conf.d/nginx-define.conf
notify:
- restart nginx
- name: start service
service:
name: nginx
state: started
enabled: yes
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
实践后期出现这个报错,但是01-template.yml 格式是正确的 原因是nginx有残留
做法:在每台主机上都yum autoremove 一下 清理掉nginx残存的东西
得到下面的结果
1.条件管理
在ansible动态生成配置文件的场景中,when语句可以对变量facts的值进行条件判断,从而实现不同的效果。
- hosts: web
remote_user: root
tasks:
- name: install package
apt: name=nginx state=present
when: ansible_os_family == "RedHat"
- hosts: web
remote_user: root
tasks:
- name: ps_check
shell: ps -ef | grep nginx | grep -v grep | wc -l
register: nginx_num
changed_when: false
ignore_errors: true
- name: print debug message
debug:
msg: "System {{ inventory_hostname }} has nginx service."
when: nginx_num.stdout != "0"
- name: install package
yum:
name: nginx
state: present
when: nginx_num.stdout == "0"
- name: create web root
file:
name: /data/webserver/html
state: directory
- name: touch web index
shell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html
- name: delete default nginx conf
file:
name: /etc/nginx/sites-enabled/default
state: absent
- name: copy config
template:
src: ./templates/nginx-define.conf.j2
dest: /etc/nginx/conf.d/nginx-define.conf
notify:
- restart nginx
- name: start service
service:
name: nginx
state: started
enabled: yes
handlers:
- name: restart nginx
service:
name: nginx
state: restarted

2.迭代管理
- hosts: web
remote_user: root
tasks:
- name: add usergroup
group:
name: webgroup
state: present
- name: add several users
user:
name: "{{ item }}"
state: present
groups: webgroup
with_items:
- testuser1
- testuser2

- hosts: web
remote_user: root
tasks:
- name: install package
yum:
name: "{{ item }}"
state: present
with_items:
- 'nginx'
- 'redis'
- 'mariadb-server'
- hosts: web
remote_user: root
tasks:
- name: add some group
user:
name: "{{ item }}"
state: present
with_items:
- group1
- group2
- group3
- name: add some users
user:
name: "{{ item.name }}"
group: "{{ item.group }}"
state: present
with_items:
- { name: 'user1', group: 'group1' }
- { name: 'user2', group: 'group2' }
- { name: 'user3', group: 'group3' }
