个人笔记ansible:循环+判断+jinja2+roles

TASK任务控制:
1.playbook判断语句
ansible_distribution

1.根据被控端操作系统进行判断安装不同的软件包.

[root@mananger tasks]# cat t1.yaml 
- hosts: webservers
  tasks:
    - name: Installed Httpd Server [ CentOS ]
      yum:
        name: httpd
        state: present
      when: ( ansible_distribution == "CentOS" )

    - name: Installed Httpd2 Server [ Ubuntu ]
      yum:
        name: httpd2
        state: present
      when: ( ansible_distribution == "Ubuntu" )
	  

1.主机名 (规范)
2.物理的cpu+内存
3.根据IP地址判断
4.不判断直接所有机器都安装

2.根据被控端主机的名称,进行判断

[root@mananger tasks]# cat t2.yaml 
- hosts: all
  tasks:
    - name: Add Nginx Yum Repository
      yum_repository:
        name: nginx
        description: Nginx Repository
        baseurl: http://nginx.org/packages/centos/7/$basearch/
        gpgcheck: no
      when: ( ansible_hostname is match ("web*")) or ( ansible_hostname is match ("lb*"))

3.根据命令执行的结果进行判断
1)检查httpd服务是否存活,如果存活,就重启,否则就不重启.

[root@mananger tasks]# cat  t3.yaml 
- hosts: webservers
  tasks:
    - name: Check Httpd Server
      shell: systemctl is-active httpd
      ignore_errors: yes
      register: check_httpd

    - name: Restart Httpd Server
      systemd:
        name: httpd
        state: restarted
      when: ( check_httpd.rc == 0 )

4.对nginx服务进行安装 配置 检查 启动
每次修改配置,都需要检查语法,如果语法错误,则不重启Nginx

[root@mananger tasks]# cat t4.yaml 
- hosts: webservers
  tasks:
    - name: Installed Nginx Server
      yum:
        name: nginx
        state: present

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

    - name: Check Nginx Status
      shell: /usr/sbin/nginx -t
      register: Check_ngx
      ignore_errors: yes

    - name: Systemd Nginx Started
      systemd:
        name: nginx
        state: started
        enabled: yes
      when: ( Check_ngx.rc == 0 )

  handlers:
    - name: Restart Nginx Server
      systemd:
        name: nginx
        state: restarted
      when: ( Check_ngx.rc == 0 )

2.playbook循环语句
列表循环 --> 安装多个软件 启动多个服务
1.批量启动服务: nginx php

[root@mananger tasks]# cat t5.yaml 
- hosts: webservers
  tasks:
    - name: Systemctl Started Nginx Php Server
      systemd:
        name: "{{ item }}"
        state: started
      loop:
        - nginx
        - php-fpm


[root@mananger tasks]# cat t8.yaml .
- hosts: webservers
  tasks:
    - name: Installed Packages
      yum: 
        name: "{{ item }}"
        state: present
      loop:
        - nginx
        - httpd-tools
        - httpd
        - tree
        - wget
        - zip
        - vim

字典循环 --> 拷贝多个文件

[root@mananger tasks]# cat t9.yaml 
- hosts: webservers
  tasks:
    - name: copy rsyncd.conf rsync.passwd
      copy:
        src: '{{ item.src }}'
        dest: '{{ item.dest }}'
        owner: '{{ item.owner }}'
        group: '{{ item.group }}'
        mode: '{{ item.mode }}'
      loop:
        - { src: rsyncd.conf.j2, dest: /etc/rsyncd.conf, mode: '0644', owner: root, group: root }
        - { src: rsync.passwd.j2, dest: /etc/rsync.passwd, mode: '0600', owner: root, group: root }
	

3.palbyook handlers
监控
触发
只有发生变化才会被触发.
如果被触发多次,仅在所有正常的task任务执行完毕后, 执行一次
4.playbook tags标签
调试时,需要使用到.
1.对一个任务打一个标签
2.多对个任务打一个标签
-t 指定执行某一个标签对应的所有任务
–skip-tags 表示要跳过指定的标签任务

- name: Add Group www
  group:
    name: www
    gid: 666
  tags: test1		# 定义标签名称 ( 名称随意 )
[root@mananger web_cluster]# ansible-playbook nginx_php_server.yaml --skip-tags test1
[root@mananger web_cluster]# ansible-playbook nginx_php_server.yaml -t test1

4.playbook 错误忽略 ignore_errors

[root@mananger tasks]# cat t10.yaml 
- hosts: webservers
  tasks:
    - name: Comamand 
      shell: /bin/false
      ignore_errors: yes

    - name: Touch FIle
      file:
        path: /tmp/tt
        state: touch

5.playbook 异常处理
1.强制调用handlers运行 ( 少 )

[root@mananger tasks]# cat t11.yaml 
- hosts: webservers
  force_handlers: yes
  tasks:
    - name: Touch File 
      file:
        path: /tmp/ansible_tt
        state: touch
      notify: Restart Nginx Server


    - name: Installed Packages
      yum:
        name: sb
        state: present


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

2.如果tasks任务对被控端没有影响,但每次都是change状态时, 我们可以抑制状态

[root@mananger tasks]# cat  t12.yaml 
- hosts: webservers
  tasks:
    - name: Get Netstat State
      shell:
        cmd: netstat -lntp
      register: Net_status
      changed_when: false
          
          
    - name: Output Net Status Vaiables
      debug:
        msg: "{{ Net_status.stdout_lines }}"

使用changed_when判断服务的状态

[root@mananger tasks]# cat t13.yaml 
- hosts: webservers
  tasks:
    - name: Installed Nginx Server
      yum:
        name: nginx
        state: present

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

    - name: Check Nginx Status
      shell: /usr/sbin/nginx -t
      register: Check_ngx
      changed_when:
        - Check_ngx.stdout.find('successful')			# 如果有successful则认为成功,继续. 否则就抛出异常
        - false
		
    - name: Systemd Nginx Started
      systemd:
        name: nginx
        state: started
        enabled: yes

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

6.jinja2
1.使用变量方式

[root@mananger tasks]# cat motd.j2 
Welcome to {{ ansible_hostname }}
This system total Memory is: {{ ansible_memtotal_mb }} MB
This system free Memory is: {{ ansible_memfree_mb }} MB
[root@mananger tasks]# cat j1.yaml 
- hosts: webservers
  tasks:
    - name: copy motd file
      template:
        src: motd.j2
        dest: /etc/motd

2.使用循环的方式:
{% for i in EXPR %}…{% endfor%}

[root@mananger tasks]# cat nginx_proxy.conf.j2 
upstream web {
{% for host in groups['webservers'] %}
	server {{host}}:80;
{% endfor %}
}	
server {
	listen 80;
	server_name xx.etiantian.org;
	location / {
		proxy_pass http://web;
	}
}

判断语句:
keepalived:
1.通过inventory设定相同变量,不同的值. ( 1个配置文件 )
2.通过判断主机名称,根据不同的主机名称下发不同的配置文件 ( 2个配置文件 )
3.通过jinja的判断来实现. ( 一个配置文件 )

{% if EXPR %}…{% elif EXPR %}…{% endif%} 作为条件判断

[root@mananger tasks]# cat keep.conf.j2 
global_defs {     
	router_id {{ ansible_hostname }}
}

vrrp_instance VI_1 {
{% if ansible_hostname == "web01" %}
	priority 150
	state MASTER
{% elif ansible_hostname == "web02" %}
	priority 100
	state BACKUP
{% endif %}
	interface eth0
	virtual_router_id 50
	advert_int 1

	authentication {
		auth_type PASS
		auth_pass 1111
}
	virtual_ipaddress {
		10.0.0.3
	}
}

#7.Ansible roles
1.已知的目录结构:
mkdir nfs-server/{tasks,handlers,templates,files}

2.定义一个yaml文件,调用角色

  • hosts: webservers
    roles:
    • role: nfs-server
[root@mananger roles]# mkdir nfs-server/{tasks,handlers,templates} -p
[root@mananger roles]# tree nfs-server/
nfs-server/
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
└── templates
    └── exports.j2


[root@mananger roles]# cat nfs-server/tasks/main.yml 
- name: Installed NFS Server
  yum:
    name: nfs-utils
    state: present

- name: Configure NFS Exports
  template:
    src: exports.j2
    dest: /etc/exports
    owner: root
    group: root
    mode: 0644
  notify: Restart NFS Server

- name: Group Gdx 5678
  group:
    name: gdx
    gid: 5678

- name: User Gdx 5678
  user:
    name: gdx
    uid: 5678
    group: '5678'
    shell: /sbin/nologin
    create_home: no

- name: Create NFS Share Direcotry
  file:
    path: /data
    state: directory
    owner: gdx
    group: gdx

- name: Systemctl NFS Server
  systemd:
    name: nfs
    state: started
    enabled: yes


[root@mananger roles]# cat nfs-server/handlers/main.yml 
- name: Restart NFS Server
  systemd:
    name: nfs
    state: restarted


[root@mananger roles]# cat nfs-server/templates/exports.j2 
/data  172.16.1.0/24(rw,all_squash,anonuid=5678,anongid=5678)

[root@mananger roles]# cat top.yml 
- hosts: webservers
  roles:
    - role: nfs-server
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值