如何在Ansible剧本中创建新的配置文件

时间:2020-01-09 10:39:03  来源:igfitidea点击:

我想创建一个名为/etc/apt/apt.conf.d/1000-force-ipv4-transport的文件,其值设置为Acquire :: ForceIPv4 true;在AWS托管的20台云服务器上。
我已经设置了Ansible剧本来自动执行操作。
如何使用Ansible剧本创建新文件?
是否可以使用Ansible IT自动化工具创建包含多行文本的复杂文件(例如squid.conf)?
您可以使用以下任一模块来创建新文件:

  • 复制模块将文件复制到远程位置。
  • 模板模块将文件模板输出到远程服务器。

如何在远程服务器上写一行内容并创建文件

语法非常简单:

- copy:
           content: "your config line here"
           dest: "/path/to/file"

当代替src使用时,将文件的内容直接设置为指定的值。
这是用于简单值,用于任何复杂或具有格式的内容,请切换到模板模块。

因此,这是一个示例create-file.yml文件:

# create a file to force apt-get to use IPv4 only
  - copy:
         content: "Acquire::ForceIPv4 true;"
         dest: "/etc/apt/apt.conf.d/1000-force-ipv4-transport"

其中:

  • ``content:" Acquire :: ForceIPv4 true;"`将文件的内容直接设置为指定的字符串
  • ``目的地:" /etc/apt/apt.conf.d/1000-force-ipv4-transport"`设置将文件复制/创建到的远程绝对路径
  • backup:yes应该复制文件的远程绝对路径。
  • owner:root设置应该拥有文件/目录的用户
  • group:root设置应该拥有文件/目录的组
  • mode:0600使用八进制数字设置文件权限

因此,这是一个示例列表文件:

$ cat ~/hosts

sh [kvmhost] 192.168.2.45 ansible_user = root 192.168.2.46 ansible_user = root``````这是我为您更新的create-file.yml:

--
# same config file
- hosts: kvmhost
  remote_user: root
  tasks:
          # create a new file on each host
          - copy: 
                  content: "Acquire::ForceIPv4 true;" 
                  dest: "/etc/apt/apt.conf.d/1000-force-ipv4-transport"
                  backup: yes
                  owner: root
                  group: root
                  mode: 0644
          # run apt-get too using IPv4 
          - apt:
                  update_cache: yes
                  cache_valid_time: 3600
                  upgrade: dist

您可以照常运行它:

$ ANSIBLE_HOSTS=~/hosts; ansible-playbook create-file.yml

如何在Ansible剧本中创建空白文件

语法非常简单:

file: 
       path: /usr/local/etc/my.conf
       state: touch
       owner: root
       group: root
       mode: 0600

其中:

  • ``path:/usr/local/etc/my.conf`设置被管理文件的路径
  • state:touch创建一个按路径设置的文件
  • owner:root设置应该拥有文件/目录的用户
  • group:root设置应该拥有文件/目录的组
  • mode:0600使用八进制数字设置文件权限

如何使用Ansible创建复杂文件

如果您需要添加多行,请考虑使用模板模块。
模板由Jinja2模板语言处理,并创建文件到远程服务器。

第1步创建名为squid.yml的Ansible Playbook

$ cat squid.yml

输出示例:

# Create squid.conf
- hosts: kvmhost
  remote_user: root
  tasks:
          - template:
                  src: squid.conf.j2
                  dest: /etc/squid/squid.conf
                  owner: root
                  group: root
                  mode: '0644'
                  validate: '/usr/sbin/squid -k check'
                  backup: yes
          - service:
                  name: squid
                  state: restarted

步骤2创建名为squid.conf.j2的Jinja2模板

$ cat squid.conf.j2

输出示例:

acl mylan src {{ theitroad_vlan_lan_subnet }}
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access allow mylan
http_access deny all
http_port {{ theitroad_http_port }}
tcp_outgoing_address {{ theitroad_cloud_server_ip }}
cache_mem {{ theitroad_memory }} MB
cache_dir diskd /var/spool/squid 1024 16 256 Q1=72 Q2=64
access_log daemon:/var/log/squid/access.log squid
coredump_dir /var/spool/squid
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .		0	20%	4320
forwarded_for delete
via off
forwarded_for off
follow_x_forwarded_for deny all
request_header_access X-Forwarded-For deny all

步骤3更新列表文件~/hosts

使用squid.conf.j2模板的变量更新了列表文件:

$ cat ~/hosts

输出示例:

### my hosts ##
[kvmhost] 192.168.2.45 ansible_user=root
192.168.2.46 ansible_user=root
## variables with values ##
[kvmhost:vars] cm_vlan_lan_subnet=10.8.0.0/24
cm_http_port=10.8.0.1:3128
cm_cloud_server_ip=72.xxx.yyy.zzz
cm_memory=1024

步骤4运行您的剧本在远程服务器上创建复杂的squid.conf文件

执行以下命令:

$ ANSIBLE_HOSTS=~/hosts; ansible-playbook squid.yml