主配置文件:/etc/ansible/ansible.cfg

主机清单文件:/etc/ansible/hosts

主机清单格式示例:

[test]  # 定义一个test的主机组

10.20.120.[1:255] ansible_ssh_user='root' ansible_ssh_pass='123456' ansible_ssh-port=2222  # 单条定义变量比主机组变量优先级高

[test:vars]  # 为test组定义主机组变量

ansible_ssh_user='root'

ansible_ssh_pass='123456'

[server:children]  # 定义一个组合组,将两个主机组组合到一个大组里

test1

test2

 

 

[defaults]

# some basic default values...

#inventory = /etc/ansible/hosts  # 信任主机清单
#library = /usr/share/my_modules/  # 模块存放路径
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp  # 远程存放临时脚本文件的目录
#local_tmp = ~/.ansible/tmp  # 本地存放临时脚本文件的目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5  # 并发数
#poll_interval = 15
#sudo_user = root  # sudo提权到root身份
#ask_sudo_pass = True  # 每次执行提权命令是否询问ssh密码
#ask_pass = True  # 每次执行ansible命令是否询问ssh密码
#transport = smart
#remote_port = 22  # 远程服务器ssh端口
#module_lang = C
#module_set_locale = False
log_path = /var/log/ansible.log  # 开启操作日志
host_key_checking = False  # 关闭主机key验证
modele_name = shell  # 修改默认模块为shell模块



常用命令
ansible-doc -l  # 列出所有模块

ansible-doc [模块名称]  # 查看模块说明

ansible all --list-hosts  # 列出主机清单中的全部主机

ansible [主机类名] -m [模块名称] -k  -o  # 执行模块

-k表示使用密码登陆,不使用key。

-o简洁输出,输出信息都在同一行

-v表示列出执行过程,v越多越详细

-i表示链接使用外部主机清单文件。

主机类名:

可以为all,表示对主机清单所有主机执行模块。

可以使用通配符,例如10.20.120.*

可以使用逻辑或关系,例如[主机清单1]:[主机清单2],两个清单内的主机都会执行

可以使用逻辑与关系,例如[主机清单1]:&[主机清单2],同时在两个清单内的主机会执行。

可以使用逻辑非关系,例如[主机清单1]:![主机清单2],在主机清单1里,但不在主机清单2里的主机会执行,其实就是排除主机清单2内的主机。

可以将以上逻辑综合使用,例如test1:test2:&test3:!test4。

可以使用正则表达式,例如~test1|test2。

ansible-valut encrypt xxx.yml  # 加密一个playbook文件

ansible-valut decrypt xxx.yml  # 解密一个playbook文件

ansible-valut view xxx.yml  # 查看一个加密的playbook文件

ansible-console控制台命令:

提示符格式:

执行用户@当前操作的主机组 (当前主机组内主机数量)[f:并发数]$

root@all (5)[f:5]$ list  # 列出当前主机组主机列表
10.20.120.231
10.20.120.240
10.20.120.242
10.20.120.220
10.20.120.237
root@all (5)[f:5]$ cd test  # 切换主机组
root@test (5)[f:5]$ forks 10  # 设置并发数为10

ansible-galaxy list  # 列出所有已安装的galaxy

ansible-galaxy install geerlingguy.mysql  # 安装galaxy

ansible-galaxy remove geerlingguy.mysql  # 删除galaxy

 

 

ansible常用模块:

1.command模块

例:ansible all -m command -a 'chdir=/home/ ls -a'

默认模块,可以执行常见的linux命令,但有一定的局限性,不能输入带标点符号的命令,如:输入重定向、输出重定向、管道符、变量。

2.shell模块

例:ansible all -m shell -a 'creates=/data/1.txt mkdir /data/ touch /data/1.txt'  # 如果1.txt文件存在就不执行命令,不存在则执行

ansible all -m shell -a 'chdir=/'  # 切换当前位置到根目录

shell模块可以执行带标点符号的命令,但也不能太过复杂。

3.script模块

ansible all -m script -a 'test.sh'

把脚本传送到主机,再执行。

4.copy模块

ansible all -m copy -a 'src=/root/test.sh dest=/root/test.sh owner=root mode=600 backup=yes'  # 复制文件,并设置属主,权限。backup:目标主机有同文件名但不同内容的文件自动备份

ansible all -m copy -a 'src=/etc/ dest=/root'  # 复制etc目录下的所有文件到远程主机,但不复制整个目录

ansible all -m copy -a "content='1234' dest=/root/1.txt"  # 指定内容,直接生成目标文件。

将ansible主控端复制文件至远程主机。可以复制整个目录。

5.fetch模块

ansible all -m fetch -a 'src=/etc/redhat-release dest=/data/'

将远程主机的文件拷贝到本机,不支持拷贝目录。src必须是文件,dest必须是目录。

5.user模块

echo '123456' | openssl passwd -1 -stdin  # 获取密文经过MD5加密后的值

ansible all -m user -a 'name=ma password=[MD5密文] state=present'  # 创建新用户,并设置密码

ansible all -m user -a 'name=ma shell=/bin/nologin append=true'  # 修改用户的登陆shell,append表示覆盖属性

ansible all -m user -a 'name=ma state=absent remove=true'  # 删除用户,remove表示删除用户家目录

6.yum模块

absible all -m yum -a 'name="*" state=absent'  # 升级系统中的所有软件包

ansible all -m yum -a 'name=httpd state=present'  # 使用yum安装httpd软件包

ansible all -m yum -a 'name=httpd state=absent'  # 使用yum卸载httpd软件包

7.service模块

ansible all -m service -a 'name=httpd state=started enabled=yes'  # 启动httpd服务并设置开机自启动

使用systemd对程序进行生命周期管理,state支持started、stopped、restarted。

8.file模块

ansible all -m file -a 'path=/root/1.txt state=touch'  # 创建文件

对文件或目录进行操作,支持的state有touch、directory、absent等

9.setup模块

ansible all -m setup -a 'filter=ansible_all_ipv4_addresses'  # 对系统的信息进行收集,并按照key值过滤出一部分。

10.unarchive模块

ansible all -m unarchive -a 'src=xxx.tar.gz dest=/usr/local/ copy=yes'

 当copy为yes时,将ansible主控机中的压缩包拷贝到远程主机进行解压

 当copy为no时,读取远程主机src中的路径进行解压。

11.template模块

ansible all -m template -a 'src=test.j2 dest=/usr/local/'

与copy模块功能类似,不同的是template模块会按照模板中的语法进行拷贝。

template模块默认会在当前执行目录templates目录下读取src指定的文件。

 

PlayBook文件示例:

 

- hosts: [主机清单名]
  remote_user: root  # 可选,操作的用户身份
  gather_facts: no  # 可选,关闭收集主机信息,可加快执行速度
  vars:
    - variable: 123
  vars_files:
    - var.yaml
  tasks:
    - name: install nginx  # 任务名称
      yum: name=nginx state=present  # model: parmeter
      tags:
        - install  # 命令行-t指定tag可单独执行该模块
    - name: start nginx service and enable power on
      service: name=nginx state=started enabled=yes
      when: ansible_hostname == "hostname"  # 当远程主机名满足条件则执行该模块
    - name: copy config
      copy: src=123.conf dest=/etc/nginx/conf.d/{{ variable }}.conf
      notify: 
        - stop nginx  # 定义一个触发器,模块执行结果为change则触发下方定义的handlers
  handlers:
    - name: stop nginx
      service: name=nginx state=stopped

 

 

ansible中使用变量:

1.直接在yaml中使用vars定义变量,使用{{ xxx }}引用

2.直接在yaml文件中引用setup模块定义的变量:{{ ansible_system }},需要gather_facts=yes

3.执行命令时定义变量,例如ansible-playbook -e key=value,调用方法同上。

4.创建一个yaml变量文件,格式为key: value一行一个。然后在剧本yaml中引用变量文件,使用vars_files参数。

5.在主机清单中定义变量。

 

ansible使用jianjia2模板:

四则运算:

{{ ansible_processor_vcpus ** 2 }}

{{ ansible_processor_vcpus + 4 }}

流程控制:

①使用列表

vim templates/test.j2

{% for i in list %}
server {{ i }}
{% endfor %}

vim playbook.yaml

- hosts: test
  vars:
    list:  # 定义一个变量为一个列表
      - a
      - b
      - c
  tasks:
    - name: copy config
      template: src=nginx.j2 dest=/etc/nginx/nginx.conf  # template模块默认会在当前执行目录templates目录下读取src指定的文件。

 ②使用字典

vim templates/test.j2

{% for i in dict %}
server {{ i }}
{% endfor %}

vim playbook.yaml

- hosts: test
  vars:
    dict:  # 定义一个变量,列表中的元素为字典
      - name: a
      - name: b
      - name: c
  tasks:
    - name: copy config
      template: src=nginx.j2 dest=/etc/nginx/nginx.conf

 ③使用if判断

vim templates/test.j2

{% for i in list %}
server {{ i.name }}
{% if i.number is defind %}  # 如果字典中number键存在,则执行
number {{ i.number }}
{% endif %}
{% endfor %}

vim playbook.yaml

- hosts: test
  vars:
    dict:
      - name: a
      - name: b
        number: 2
      - name: c
        number: 3
  tasks:
    - name: copy config
      template: src=nginx.j2 dest=/etc/nginx/nginx.conf

 playbook使用迭代:

- hosts: test
  remote_user: root
  tasks:
    - name: create group
      group: name={{ item }} state=present  # item是对列表中元素的引用
      with_items:  # 根据列表的元素数量,重复执行当前模块
        - majiajun1
        - majiajun2
        - majiajun3
    - name: create user
      user: name={{ item.name }} group={{ item.group }} state=present  # 对列表中字典的引用
      with_items:
        - name: majiajun1
          group: majiajun1
        - name: majiajun2
          group: majiajun2
        - name: majiajun3
          group: majiajun3

 role编写实例:

目录结构:

 

 

 

 

 vi userconf.yaml  # 与roles在同级目录,用于指定操作主机和变量的输入

- hosts: [主机清单]
  roles:
    - git
    - user

vi git/tasks/main.yaml

- include: create_dir.yaml
- include: git_checkout.yaml
- include: static_git_pull.yaml

vi git/tasks/create_dir.yaml

- name: test task
  shell: echo test

vi git/vars/main.yaml

test1: 1
test2: 2

 

posted on 2022-03-08 22:26  majiajun  阅读(94)  评论(0)    收藏  举报