Ansible-playbook
如果Ansible模块是您工作中的工具,那么Playbook就是您的使用说明书,而您的主机资产文件就是您的原材料。
--- - hosts: webservers vars: http_port: 80 server_name: www.ctnrs.com remote_user: root gather_facts: false tasks: - name: 安装nginx最新版 yum: pkg=nginx state=latest - name: 写入nginx配置文件 template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf notify: - restart nginx - name: 确保nginx正在运行 service: name=httpd state=started handlers: - name: restart nginx service: name=nginx state=reloaded
- hosts: webservers remote_user: lizhenliang become: yes become_user: root
become: yes 提权
become_user: 提权的用户是谁
命令行执行:
ansible-playbook nginx.yaml -u lizhenliang -k -b -K
-k 普通用户输入密码
-b 提权
-K 提权用户输入密码
-e VAR=VALUE
- 主机变量与组变量
在Inventory,主机清单中定义变量。
[webservers] 192.168.1.100 192.168.2.100 [webservers:vars] ansible_ssh_user=root hostname=web1
- 单文件存储
如果变量过多就可以使用一个文件进行定义变量
除了将变量直接存储在Inventory文件之外,主机和组变量还可以存储在相对于Inventory文件的单个文件中。
组变量:【要自己创建】
group_vars 存放的是组变量目录
group_vars/all.yml 表示所有主机有效,等同于[all:vars]
# vi /etc/ansible/group_vars/all.yml work_dir: /data # vi /etc/ansible/host_vars/webservers.yml nginx_port: 80
- 在Playbook中定义
- hosts: webservers vars: http_port: 80 server_name: www.hebbao.com
Register变量
- name: shell: | netstat -lntup | grep 80 register: result #注册变量,把结果注册到result变量里 - debug: #把result变量内容打印出来 var: result
每个play包含一系列任务。这些任务按照顺序执行,在play中,所有主机都会执行相同的任务指令。play目的是将选择的主机映射到任务。
tasks: - name: 安装nginx最新版 yum: pkg=nginx state=latest
测试运行,不实际操作:ansible-playbook -C /path/to/playbook.yaml
- debug: msg={{group_names}} - name: 主机名 debug: msg: "{{inventory_hostname}}"
如果你有一个大的剧本,那么能够在不运行整个剧本的情况下运行特定部分可能会很有用。
tasks: - name: 安装nginx最新版 yum: pkg=nginx state=latest tags: install - name: 写入nginx配置文件 template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf tags: config
使用:
ansible-playbook example.yml --tags "install" ansible-playbook example.yml --tags "install,config" ansible-playbook example.yml --skip-tags "install"
条件判断:
tasks: - name: 只在192.168.1.100运行任务 debug: msg="{{ansible_default_ipv4.address}}" when: ansible_default_ipv4.address == '192.168.1.100'
循环执行:
tasks: - name: 批量创建用户 user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2
- name: 解压 copy: src={{ item }} dest=/tmp with_fileglob: - "*.txt" - "*.html"
常用循环语句:
语句 | 描述 |
---|---|
with_items | 标准循环 |
遍历目录文件 | |
with_dict | 遍历字典 |
vars: domain: "www.ctnrs.com" tasks: - name: 写入nginx配置文件 template: src=/srv/server.j2 dest=/etc/nginx/conf.d/server.conf
# server.j2 {% set domain_name = domain %} #set是设置一个变量,domain变量要在ansible-playbook中定义 server { listen 80; server_name {{ domain_name }}; location / { root /usr/share/html; } }
在jinja里使用ansible变量直接 {{ }}引用。使用ansible变量赋值jinja变量不用{{ }}引
也可在jinja里使用ansible变量直接 {{ }}引用。使用ansible变量赋值jinja变量不用{{ }}引以不在ansible-playbook中指定
# server.j2 {% set domain_name = 123 %} server { listen 80; server_name {{ domain_name }}; location / { root /usr/share/html; } }
{% set local_ip = inventory_hostname %}
{% set list=['one', 'two', 'three'] %} {% for i in list %} {% if i == 'two' %} -> two {% elif loop.index == 3 %} -> 3 {% else %} {{i}} {% endif %} {% endfor %}
例如:生成连接etcd字符串
{% for host in groups['etcd'] %} https://{{ hostvars[host].inventory_hostname }}:2379 {% if not loop.last %},{% endif %} {% endfor %}
继续阅读

我的微信
这是我的微信扫一扫
评论