在 cloud-init 中使用有效的 YAML to 运行 命令将文本添加到文件
Using valid YAML in cloud-init to run commands that add text to file
如何使用 cloud-init,运行 向文件添加文本(字符串列表)?另外,我是否需要转义冒号 :
字符?看来这个问题是 YAML 验证,但找不到任何示例来帮助我。
这是我试过的方法。 None 个回显命令似乎有效。
#cloud-config
runcmd:
- aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz
- tar -xf /opt/elastic/elasticsearch.tar.gz
- ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch
- cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp
- echo 'cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'discovery.seed_hosts: ["host1.domain.internal", "host2.domain.internal", "host3.domain.internal"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'cluster.initial_master_nodes: ["node1", "node2", "node3"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
您没有充分引用列表中的值,因此 echo
语句中的 :
被解释为 key: value
分隔符。您想要引用每一行的全部内容,最好的方法可能是使用 YAML 引用运算符之一(>
、折叠引用运算符或 |
文字引用运算符) .您会找到有关此主题的一些文档 here。
像这样:
#cloud-config
runcmd:
- |
aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz
- |
tar -xf /opt/elastic/elasticsearch.tar.gz
- |
ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch
- |
cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp
- |
echo 'cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'discovery.seed_hosts: ["host1.domain.internal", "host2.domain.internal", "host3.domain.internal"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'cluster.initial_master_nodes: ["node1", "node2", "node3"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
您可以通过一个
YAML-to-JSON 转换器,它将向您显示:
[
"aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz\n",
"tar -xf /opt/elastic/elasticsearch.tar.gz\n",
"ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch\n",
"cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp\n",
"echo 'cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'discovery.seed_hosts: [\"host1.domain.internal\", \"host2.domain.internal\", \"host3.domain.internal\"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'cluster.initial_master_nodes: [\"node1\", \"node2\", \"node3\"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n"
]
你应该能够将这些行组合成一个单独的 multi-line shell 脚本,就像这样(我冒昧地将多个 echo
语句替换为单个“这里”-文件):
#cloud-config
runcmd:
- |
aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz
tar -xf /opt/elastic/elasticsearch.tar.gz
ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch
cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp
cat >> /opt/elastic/elasticsearch/config/elasticsearch.yml <<EOF
cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
discovery.seed_hosts: ["host1.domain.internal", "host2.domain.internal", "host3.domain.internal"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
cluster.initial_master_nodes: ["node1", "node2", "node3"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
EOF
这可能更易于阅读和维护。
如何使用 cloud-init,运行 向文件添加文本(字符串列表)?另外,我是否需要转义冒号 :
字符?看来这个问题是 YAML 验证,但找不到任何示例来帮助我。
这是我试过的方法。 None 个回显命令似乎有效。
#cloud-config
runcmd:
- aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz
- tar -xf /opt/elastic/elasticsearch.tar.gz
- ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch
- cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp
- echo 'cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'discovery.seed_hosts: ["host1.domain.internal", "host2.domain.internal", "host3.domain.internal"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- echo 'cluster.initial_master_nodes: ["node1", "node2", "node3"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
您没有充分引用列表中的值,因此 echo
语句中的 :
被解释为 key: value
分隔符。您想要引用每一行的全部内容,最好的方法可能是使用 YAML 引用运算符之一(>
、折叠引用运算符或 |
文字引用运算符) .您会找到有关此主题的一些文档 here。
像这样:
#cloud-config
runcmd:
- |
aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz
- |
tar -xf /opt/elastic/elasticsearch.tar.gz
- |
ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch
- |
cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp
- |
echo 'cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'discovery.seed_hosts: ["host1.domain.internal", "host2.domain.internal", "host3.domain.internal"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
- |
echo 'cluster.initial_master_nodes: ["node1", "node2", "node3"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
您可以通过一个 YAML-to-JSON 转换器,它将向您显示:
[
"aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz\n",
"tar -xf /opt/elastic/elasticsearch.tar.gz\n",
"ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch\n",
"cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp\n",
"echo 'cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'discovery.seed_hosts: [\"host1.domain.internal\", \"host2.domain.internal\", \"host3.domain.internal\"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n",
"echo 'cluster.initial_master_nodes: [\"node1\", \"node2\", \"node3\"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml\n"
]
你应该能够将这些行组合成一个单独的 multi-line shell 脚本,就像这样(我冒昧地将多个 echo
语句替换为单个“这里”-文件):
#cloud-config
runcmd:
- |
aws s3 cp s3://my-bucket/elasticsearch/elasticsearch.tar.gz /opt/elastic/elasticsearch.tar.gz
tar -xf /opt/elastic/elasticsearch.tar.gz
ln -sv /opt/elastic/elasticsearch-7.7.6 /opt/elastic/elasticsearch
cp /opt/elastic/elasticsearch/config/elasticsearch.yml /opt/elastic/elasticsearch/config/elasticsearch.yml.bkp
cat >> /opt/elastic/elasticsearch/config/elasticsearch.yml <<EOF
cluster.name: DEMO' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
node.name: node1' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
path.data: /opt/elastic/data' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
path.logs: /opt/elastic/logs' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
network.host: host1.domain.internal' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
http.port: 9200' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
discovery.seed_hosts: ["host1.domain.internal", "host2.domain.internal", "host3.domain.internal"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
cluster.initial_master_nodes: ["node1", "node2", "node3"]' >> /opt/elastic/elasticsearch/config/elasticsearch.yml
EOF
这可能更易于阅读和维护。