ansible(4)

ansible task任务控制

判断语句when

基于不同的操作系统安装不同的服务。
配置方法:
- hosts: webservers
  tasks:
    - name: install http server centos
      yum:
        name: httpd
        state: present
      when: (ansible_distribution == "CentOS")

    - name: install http server ubuntu
      yum:
        name: http2
        state: present
      when: (ansible_distribution == "Ubuntu")

基于不同的主机名安装
- hosts: all
  tasks:
    - name: configure nginx repo
      copy:
        src: ./nginx.repo.j2
        dest: /etc/nginx.repo/nginx.repo
    - name: install nginx server
      yum: 
        name: nginx
        state: present
      when: (ansible_hostname is match("web*"))
# 上述代码完成的功能是只给web服务器添加nginx官方源并安装nginx。

循环语句loop | with_item

loop

使用loop循环安装多个软件包{不推荐,建议使用变量的方法去安装多个软件包}
- hosts: webservers
  tasks:
    - name: install rpm all
      yum:
        name: "{{ item }}"
        state: present
      loop:
        - httpd
        - httpd-tools

利用循环的方式去启动多个程序
		一个tasks安装多个软件  (列表)

[root@manager ansible_tasks]# cat t3.yml
- hosts: webservers
  tasks:
    - name: Install Rpm All
      yum:
        name: "{{ item }}"  #固定的变量(会在loop列表中依次提取对应的值 )
        state: present
      loop:
        - httpd
        - httpd-tools

#官方
- name: ensure a list of packages installed
  yum:
    name: "{{ packages }}"
  vars:
    packages:
    - httpd
    - httpd-tools

		一个tasks启动多个服务  (列表)

[root@manager ansible_tasks]# cat t4.yml
- hosts: webservers
  tasks:

    - name: Started Nginx And PHP-FPM Server
      systemd:
        name: "{{ item }}"
        state: started
        enabled: yes
      loop:
        - nginx
        - php-fpm

		
一个tasks拷贝多个文件  (字典)
[root@manager ansible_tasks]# cat 5.yml 
- hosts: webservers
  tasks:
    - name: create two files
      copy:
        src: "./{{item.src}}"
        dest: "{{item.dest}}"
        owner: root
        group: root
        mode: "{{item.mode}}"
      loop:
        - {src: rsyncd.conf.j2,dest: /etc/rsyncd.conf,mode: "0644"}
        - {src: rsync.pass.j2,dest: /etc/rsync.pass,mode: "0600"}



触发器handlers

常用于监控配置文件,一旦配置文件发生变更,便触发handlers。
无论多少个task通知了相同的handlers,handlsers仅会在所有tasks结束后运行一次。
只有task发生改变了才会通知handlers,没有改变则不会触发handlers。
不能使用handlers替代tasks,因为handlers是一个特殊的tasks。

标签tag

默认情况下,ansible在执行一个playbook时,会执行playbook中定义的所有任务,ansible的标签功能可以给单独任务生只整个playbook打上标签,然后利用这些标签来指定要运行playbook中的个别任务,或不执行指定的任务。

  1. 打标签的方式有几种,比如:
    对一个task打标签、对一个task大多个标签、对多个task打一个标签
    配置方法示例:
[root@manager ansible_tasks]# cat t7.yml
- hosts: webservers
  tasks:
    - name: Install Nfs Server
      yum:
        name: nfs-utils
        state: present
      tags: install_nfs

    - name: Service Nfs Server
      service:
        name: nfs-server
        state: started
        enabled: yes
      tags: start_nfs

	指定执行 playbook中的某一个标签 (  通常是用来快速解决问题  )
[root@manager ansible_tasks]# ansible-playbook t7.yml -t install_nfs

	指定排除某个tags,其余都正常执行
[root@manager ansible_tasks]# ansible-playbook t7.yml --skip-tags install_nfs

  1. 对task标签应该如何使用
    -t: 指定执行哪个tag
    – skip-tags: 表示执行除了这个标签以外其他的所有任务。

包含include

用于playbook文件复用。
有时,我们发现大量的playbook内容需要重复编写,各tasks之间功能需互相调用才能完成各自功能,playbook帮打到维护困难,这是我们需要使用includes。
比如,A、B两个项目都需要用到重启httpd服务,我们就可用使用include来实现,具体方法如下:

[root@manager ansible_tasks]# cat restart_nginx.yml
- name: Restart Nginx Server
  systemd:
    name: nginx
    state: restarted
[root@manager ansible_tasks]# cat a_project.yml
- hosts: webservers
  tasks:
    - name: A Project command
      command: echo "A"

    - name: Restart Nginx
      include: restart_nginx.yml
[root@manager ansible_tasks]# cat b_project.yml
- hosts: webservers
  tasks:
    - name: B Project command
      command: echo "B"

    - name: Restart Nginx
      include: restart_nginx.yml

忽略错误 Ignore_errors

用于某个task偶尔会执行失败,但是该tasks并不影响后续tasks正常运行,这个时候我们就可以给他加上ignore_errors来实现问题。

- hosts: webservers
  tasks:

    - name: Shell Command
      command: /bin/false
      ignore_errors: yes #忽略错误

    - name: Create File
      file:
         path: /tmp/text1.txt
         state: touch

异常处理

1.控制task报告的状态,不一定必须是"changed"

[root@manager ansible_tasks]# cat t8.yml
- hosts: webservers
  tasks:

    - name: Get Nginx Port Status
      shell:  netstat -lntp | grep nginx
      register: ngx_status

    - name: Debug Nginx Status
      debug:
        msg: "{{ ngx_status.stdout_lines }}"

-------
[root@manager ansible_tasks]# cat t8.yml
- hosts: webservers
  tasks:

    - name: Get Nginx Port Status
      shell:  netstat -lntp | grep nginx
      register: ngx_status
      changed_when: false       #该tasks任务不会发生changed提示了


    - name: Debug Nginx Status
      debug:
        msg: "{{ ngx_status.stdout_lines }}"



2.使用changed_when检查tasks任务返回的结果

[root@manager ansible_tasks]# cat t9.yml
- hosts: webservers
  tasks:
    - name: Install Nginx Server
      yum:
       name: nginx
       state: present
      tags: Install_Nginx_Server

    - name: Configure Nginx Server
      copy:
        src: ./nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Restart Nginx Server

    - name: Check Nginx Configure File
      shell: nginx -t
      register: check_ngx          #将nginx -t的结果存储至check_ngx变量中
      changed_when:
        - false			   #由于没有在被控端执行任何操作,所以可以将其修改为false,这个任务每次执行就ok状态
        - check_ngx.stdout.find('successful')	#检查变量中是否存在successful的字符串,如果存在则继续,不存在则停止,并报错。

    - name: Started Nginx Server
      systemd:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Restart Nginx Server
      systemd:
        name: nginx
        state: restarted


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值