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

3. 标签
给任务添加标签



- hosts: webtags: host-tagsremote_user: roottasks:- name: create new useruser:name: nginx-testsystem: yesuid: 82shell: /sbin/nologintags: installtask- name: test new usershell: getend passwd | grep nginx-testignore_errors: Truetags: installtask- name: create web rootfile:name: /data/webserver/htmlowner: nginx-teststate: directorytags: installtask- name: touch web indexshell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.htmltags: installtask- name: install packageyum:name: nginxstate: presenttags: installtask- name: copy configcopy:src: nginx.confdest: /etc/nginx/nginx.conftags: installtask- name: copy subconfigcopy:src: nginx-define.confdest: /etc/nginx/conf.dnotify:- restart nginx- check nginxtags:- changetask- installtask- name: start serviceservice:name: nginxstate: startedenabled: yestags: installtaskhandlers:- name: restart nginxservice:name: nginxstate: restarted- name: check nginxshell: 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: allremote_user: roottasks:- name: create filefile:name: /var/log/var-{{ ansible_fqdn }}.logstate: touchowner: daemon

1. 主机列表变量
- hosts: webremote_user: roottasks:- name: set hostnamehostname:name: ansible-{{ name }}.example.com
主机清单下改成这个

实践: 文件名03-v.yml

- hosts: webremote_user: roottasks:- name: set hostnamehostname: name={{ qian }}-{{ name }}{{ hou }}
2. 命令行
3. playbook实践

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


- hosts: webremote_user: rootvars_files:- vars.yamlvars:- head: www- tail: .ansible.toptasks:- name: set hostnamehostname: name={{ qian }}-{{ name }}{{ hou }}

6. 模板
server {listen {{ nginx_port }};root /data/webserver/html;location / {}
}
4.改造playbook.yaml
- hosts: webremote_user: roottasks:- name: install packageyum:name: nginxstate: present- name: create web rootfile:name: /data/webserver/htmlstate: directory- name: touch web indexshell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html- name: delete default nginx conffile:name: /etc/nginx/sites-enabled/defaultstate: absent- name: copy configtemplate:src: ./templates/nginx-define.conf.j2dest: /etc/nginx/conf.d/nginx-define.confnotify:- restart nginx- name: start serviceservice:name: nginxstate: startedenabled: yeshandlers:- name: restart nginxservice:name: nginxstate: restarted
实践后期出现这个报错,但是01-template.yml 格式是正确的 原因是nginx有残留
做法:在每台主机上都yum autoremove 一下 清理掉nginx残存的东西
得到下面的结果
1.条件管理
在ansible动态生成配置文件的场景中,when语句可以对变量facts的值进行条件判断,从而实现不同的效果。
- hosts: webremote_user: roottasks:- name: install packageapt: name=nginx state=presentwhen: ansible_os_family == "RedHat"
- hosts: webremote_user: roottasks:- name: ps_checkshell: ps -ef | grep nginx | grep -v grep | wc -lregister: nginx_numchanged_when: falseignore_errors: true- name: print debug messagedebug:msg: "System {{ inventory_hostname }} has nginx service."when: nginx_num.stdout != "0"- name: install packageyum:name: nginxstate: presentwhen: nginx_num.stdout == "0"- name: create web rootfile:name: /data/webserver/htmlstate: directory- name: touch web indexshell: echo '<h1>welcome to ansible</h1>' > /data/webserver/html/index.html- name: delete default nginx conffile:name: /etc/nginx/sites-enabled/defaultstate: absent- name: copy configtemplate:src: ./templates/nginx-define.conf.j2dest: /etc/nginx/conf.d/nginx-define.confnotify:- restart nginx- name: start serviceservice:name: nginxstate: startedenabled: yeshandlers:- name: restart nginxservice:name: nginxstate: restarted

2.迭代管理
- hosts: webremote_user: roottasks:- name: add usergroupgroup:name: webgroupstate: present- name: add several usersuser:name: "{{ item }}"state: presentgroups: webgroupwith_items:- testuser1- testuser2

- hosts: webremote_user: roottasks:- name: install packageyum:name: "{{ item }}"state: presentwith_items:- 'nginx'- 'redis'- 'mariadb-server'
- hosts: webremote_user: roottasks:- name: add some groupuser:name: "{{ item }}"state: presentwith_items:- group1- group2- group3- name: add some usersuser:name: "{{ item.name }}"group: "{{ item.group }}"state: presentwith_items:- { name: 'user1', group: 'group1' }- { name: 'user2', group: 'group2' }- { name: 'user3', group: 'group3' }
