--- - hosts: test #指定主机组 remote_user: root #指定ssh登陆的用户 tasks: - name: test server ping:
使用sudo切换html
--- - hosts: test remote_user: root become: yes #become参数在2.6版本用于指定sudo become_user: admin #sudo的用户 tasks: - name: test server ping:
tasks: - name: task_name #任务名称 module: module_args #使用的模块,以及模块参数,列如yum: name=nginx state=present
--- - hosts: 10.1.210.51 remote_user: root tasks: - name: install package #使用yum安装包 yum: name=httpd state=present - name: start httpd #启动该服务 service: name=httpd state=started
执行:nginx
--- - hosts: 10.1.210.53 remote_user: root tasks: - name: test facts var shell: echo "{{ ansible_all_ipv4_addresses }}" > host_ip.txt
#单独主机变量,优先级高于公共变量 host varname=value #主机组变量 [groupname:vars] #为指定主机组自定义变量,vars为关键字 varname=value
列如:web
vi /etc/ansible/hosts 10.1.210.51 business=card #变量名为business值为card 10.1.210.53 [dev] 10.1.210.33 10.1.210.32 [dev:vars] #组变量定义 myname=wd
示例:shell
[root@app52 ~]# cat test.yaml --- - hosts: 10.1.210.51 remote_user: root tasks: - name: test facts from hosts debug: var=business #使用debug打印变量的值,var参数测试变量不须要用{{ }}
运行playbook:json
3.playbook中定义变量vim
格式:服务器
vars: - varname1: value1 - varname2: value2
示例:app
--- - hosts: 10.1.210.51 remote_user: root vars: - pkg_name: httpd - pkg_cmd: /usr/sbin/httpd tasks: - name: restart httpd service: name={{ pkg_name }} state=restarted - name: copy cmd copy: src={{ pkg_cmd }} dest=/tmp/
运行playbook:ssh
4.命令行中定义变量curl
ansible-playbook -e 'varname=value’ #该方式定义的变量优先级最高
5.经过文件引用变量。
[root@app52 ~]# cat /tmp/myvars.yml var1: value1 var2: value2
playbook中使用
--- - hosts: 10.1.210.51 remote_user: root vars_files: - /tmp/myvars.yml #变量文件 tasks: - name: test myvar debug: msg="{{ var1 }}/{{ var2 }}" #这里的var1变量和var2变量来自于文件/tmp/myvars.yml
运行结果:
6.在roles中定义变量,后续在介绍roles在讲解。
vim /tmp/nginx.conf.j2 user nginx; worker_processes {{ ansible_processor_vcpus }}; #使用cpu个数做为woeker数量 error_log /var/log/nginx_error.log crit; pid /var/run/nginx.pid; include /usr/share/nginx/modules/*.conf; worker_rlimit_nofile 65535; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; server { listen 80; server_name {{ ansible_fqdn }} #使用主机名做为hostname access_log /var/log/access.log; error_log /var/log/error.log; } }
2.playbook中使用
--- - hosts: 10.1.210.53 remote_user: root vars: - package_name: nginx - config_path: /etc/nginx/nginx.conf tasks: - name: install epel yum: name=epel-release - name: install package yum: name={{ package_name }} - name: copy config file template: src=/tmp/nginx.conf.j2 dest={{ config_path }} backup=yes #backup用于备份 - name: start service service: name={{ package_name }} state=started
运行playbook
- hosts: 10.1.210.53 remote_user: root vars: - package_name: nginx - config_path: /etc/nginx/nginx.conf tasks: - name: install epel yum: name=epel-release - name: install package yum: name={{ package_name }} - name: copy config file template: src=/tmp/nginx.conf.j2 dest={{ config_path }} backup=yes notify: #当配置文件发生变化时候,通知hanler触发task - stop service - start service handlers: - name: stop service service: name={{ package_name }} state=stopped - name: start service service: name={{ package_name }} state=started
运行playbook
--- - hosts: 10.1.210.51 remote_user: root tasks: - name: exec tag1 shell: cat /etc/passwd tags: tag1 - name: exec tag2 file: path=/tmp/b.txt state=touch tags: tag2 - name: view password shell: cat /etc/passwd
列出tag
指定运行某个tag任务
跳过tag任务运行
从以上结果可看出,跳过了tag1和tag2任务,只运行了view password任务。
示例一:使用facts变量测试
tasks: - name: "shut down Debian flavored systems" command: /sbin/shutdown -t now when: ansible_facts['os_family'] == "Debian" #当操做系统是Debian才执行该任务
示例二:使用逻辑运算进行多条件判断
tasks: - name: "shut down CentOS 6 and Debian 7 systems" command: /sbin/shutdown -t now when: (ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6") or (ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "7")
两个条件使用and还能够以下表示
tasks: - name: "shut down CentOS 6 systems" command: /sbin/shutdown -t now when: - ansible_facts['distribution'] == "CentOS" - ansible_facts['distribution_major_version'] == "6" #同时知足系统是CentOS且版本是6
示例三:根据任务的执行结果状态来判断任务是否执行,这里使用register来保存了任务执行结果,后续会介绍。
--- - hosts: 10.1.210.51 name: test when remote_user: root tasks: - name: task1 command: /bin/false register: result #将本次任务结果保存在变量中 ignore_errors: True #忽略错误执行,可确保任务错误也能执行下一个任务 - name: pre task failed file: path=/tmp/failed.txt state=touch when: result is failed #判断result结果是不是failed - name: pre task successed state=touch file: path=/tmp/success.txt when: result is succeeded #判断result结果是不是succeeded - name: pre task skipped state=touch file: path=/tmp/skip.txt when: result is skipped #判断结果是不是skipped
运行一下:
如上图,红色的部分任务都跳过了未执行,这是由于result结果是failded,因此只执行了“pre task failed”这个任务。
示例4:使用变量进行测试
--- - hosts: 10.1.210.51 name: test var when remote_user: root vars: - flag: true #变量定义 tasks: - name: test server ping: when: flag #判断变量flag为true执行 - name: create file file: path=/tmp/myfile.txt state=touch when: not flag #变量flag不为true执行
执行结果:
一样能够看到create file 任务被跳过了。
register注册变量,用于保存任务结果,可用于保存配置或when关键字判断,这是很是有用了,在上个示例中使用了任务结果做为判断条件。例如,你能够将文件中的配置或者json内容保存在变量中,能够供后续使用:
--- - hosts: 10.1.210.51 name: test register remote_user: root tasks: - name: read conf shell: cat /tmp/nginx.conf register: nginx_conf #注册变量 - name: copy conf copy: content={{ nginx_conf }} dest=/etc/nginx/nginx.conf #使用变量
还能够配合循环使用,如下示例展现了批量建立软连接:
- name: registered variable usage as a loop list hosts: all tasks: - name: retrieve the list of home directories command: ls /home register: home_dirs - name: add home dirs to the backup spooler file: path: /mnt/bkspool/{{ item }} src: /home/{{ item }} state: link loop: "{{ home_dirs.stdout_lines }}"
--- - hosts: localhost remote_user: root tasks: - name: create user user: name={{ item }} state=present with_items: - zabbix - admin
执行结果:
示例二:循环中使用register注册变量
- hosts: localhost remote_user: root tasks: - command: echo {{ item }} with_items: [ 0, 2, 4, 6, 8, 10 ] register: num - debug: msg="{% for i in num.results %} {{i.stdout}} {% endfor %}"
注意,将with_items迭代后的结果注册为变量时,其注册结果也是列表式的,且其key为"results"。具体的结果比较长,可使用debug模块的var或msg参数观察变量的结果。以上示例运行结果以下:
2.with_dict迭代字典
--- - hosts: localhost remote_user: root tasks: - debug: msg="{{ item.key }} / {{ item.value }}" with_dict: { ip: 10.1.210.51, hostname: app52, gateway: 10.1.210.1}
以上示例中字典是已经存在了,除此以外字典能够来源于变量、facts等。例如使用facts进行迭代
--- - hosts: localhost remote_user: root tasks: - debug: msg="{{item.key}} / {{item.value}}" with_dict: "{{ ansible_cmdline }}"
若是将全部的play都写在一个playbook中,很容易致使这个playbook文件变得臃肿庞大,且不易读。所以,能够将多个不一样任务分别写在不一样的playbook中,而后使用include将其包含进去便可。include能够导入两种文件:导入task文件、导入playbook。
示例:建立task.yml任务列表
vim task.yml - name: task1 debug: msg="exec task1" - name: task2 debug: msg="exec task2"
在目标playbook中倒入任务
---
- hosts: 10.1.210.51
remote_user: root
tasks:
- include: task.yml
执行playbook:
示例2:直接导入其余playbook,不过在ansible2.8将移除,2.8中将使用import_playbook
--- - hosts: 10.1.210.51 remote_user: root tasks: - include: task.yml - include: test_when.yml - include: test_with.yml
例如:一个nginx角色的目录结构能够是:
.
└── nginx
├── default
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
多个role目录:
├── httpd #http role │ ├── default │ ├── files │ ├── handlers │ ├── meta │ ├── tasks │ ├── templates │ └── vars └── nginx #nginx role ├── default ├── files ├── handlers ├── meta ├── tasks ├── templates └── vars
1、建立对应的目录结构:
[root@app52 ~]# mkdir -pv roles/nginx/{files,templates,vars,tasks,handlers,meta,default} mkdir: 已建立目录 "roles" mkdir: 已建立目录 "roles/nginx" mkdir: 已建立目录 "roles/nginx/files" mkdir: 已建立目录 "roles/nginx/templates" mkdir: 已建立目录 "roles/nginx/vars" mkdir: 已建立目录 "roles/nginx/tasks" mkdir: 已建立目录 "roles/nginx/handlers" mkdir: 已建立目录 "roles/nginx/meta" mkdir: 已建立目录 "roles/nginx/default”
2、定义变量
[root@app52 ~]# vi roles/nginx/vars/main.yml pkg_name: nginx #安装包名称 listen_port: 80 #监听端口
3、编写任务
这里能够把任务模块化,最后在main.yml包含它们
[root@app52 ~]# vi roles/nginx/tasks/yum.yml - name: install epel yum: name=epel-release state=present - name: install nginx pkg yum: name={{ pkg_name }} state=present [root@app52 ~]# vi roles/nginx/tasks/copy.yml - name: copy nginx.conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: copy index.html copy: src=index.html dest=/var/www/html/ notify: reload [root@app52 ~]# vi roles/nginx/tasks/start_service.yml - name: start nginx service: name=nginx state=restarted [root@app52 ~]# vi roles/nginx/tasks/main.yml - include: yum.yml - include: copy.yml - include: start_service.yml
4、准备配置文件以及index.html
#index.html [root@app52 ~]# vi roles/nginx/files/index.html <h1>Hello wd</h1> #配置文件模版 [root@app52 ~]# vi roles/nginx/templates/nginx.conf.j2 user nginx; worker_processes {{ ansible_processor_vcpus }}; #使用cpu个数做为woeker数量 error_log /var/log/nginx_error.log crit; pid /var/run/nginx.pid; include /usr/share/nginx/modules/*.conf; worker_rlimit_nofile 65535; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; server { listen {{ listen_port }}; server_name {{ ansible_all_ipv4_addresses[0] }} ; #使用IP地址做为server name root /var/www/html ; access_log /var/log/access.log; error_log /var/log/error.log; } }
5、编写handlers
若是在task中使用了notify,则就须要写对应的handlers,上述我使用了reload这个handler,因此这里须要定义:
[root@app52 ~]# vi roles/nginx/handlers/main.yml - name: reload service: name=nginx state=reloaded
6、在角色同级目录编写playbook引入角色
[root@app52 ~]# vi roles/install_nginx.yml - hosts: web #指定使用role的主机或主机组 remote_user: root #指定用户 roles: #使用的role,能够有多个 - nginx
最后的目录结构为:
[root@app52 ~]# tree roles/ roles/ ├── install_nginx.yml └── nginx ├── default ├── files │ └── index.html ├── handlers │ └── main.yml ├── meta ├── tasks │ ├── copy.yml │ ├── main.yml │ ├── start_service.yml │ └── yum.yml ├── templates │ └── nginx.conf.j2 └── vars └── main.yml 8 directories, 9 files
7、运行playbook并测试
如红色部分,curl测试nginx 安装成功。